Múltiples comandos en un alias para bash


133

Me gustaría definir un alias que ejecute los dos comandos siguientes consecutivamente.

gnome-screensaver 
gnome-screensaver-command --lock 

En este momento He añadido

alias lock='gnome-screensaver-command --lock' 

a mi .bashrc pero ya he cerrado mi estación de trabajo tan a menudo sería más fácil simplemente escribir un comando.

260

Probar:

alias lock='gnome-screensaver; gnome-screensaver-command --lock' 

o

lock() { 
    gnome-screensaver 
    gnome-screensaver-command --lock 
} 

en su .bashrc

La segunda solución permite el uso de argumentos.

+5

¿No debería ser "bloqueo de la función() {} bla" ? 14 ene. 102010-01-14 12:12:53

+7

Utilizo la sintaxis 'sh', que también funciona con' bash'. 14 ene. 102010-01-14 13:54:55

+2

¿Cómo se pasa el argumento? La variable de anidamiento 'msg' dentro de 'lock()' paréntesis da error 'error de sintaxis cerca del token inesperado' msg'' .. 25 mar. 142014-03-25 14:57:54

+6

Una vez que la función ha sido definida, se comporta como un comando: los argumentos están en la línea de comando, separados por espacios en blanco . En la parte de declaración, los argumentos son '$ 1',' $ 2' ... en el cuerpo de la función. 25 mar. 142014-03-25 15:17:23

  0

gracias por la mención de la función multilínea 13 jul. 142014-07-13 07:58:30


11

¿Esto no funciona?

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock' 

4

Esto iría en los 2 comandos uno tras otro:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock' 

2

así que use un punto y coma:

alias lock='gnome-screensaver; gnome-screen-saver-command --lock' 

esto no funciona bien si desea proporcionar argumentos al primer comando. O bien, cree una secuencia de comandos trivial en su directorio $ HOME/bin.


9

Los alias están destinados a aliasing nombres de comando. Cualquier cosa más allá de eso debe hacerse con funciones.

alias ll='ls -l' # The ll command is an alias for ls -l 

Los alias son nombres que todavía están asociados con el nombre original. ll es un tipo ligeramente específico de ls.

d() { 
    if exists colordiff; then 
     colordiff -ur "[email protected]" 
    elif exists diff; then 
     diff -ur "[email protected]" 
    elif exists comm; then 
     comm -3 "$1" "$2" 
    fi | less 
} 

Una función es un nuevo comando que tiene lógica interna. No es simplemente un cambio de nombre de otro comando. Hace operaciones internas.

Técnicamente, los alias en el lenguaje de shell Bash son tan limitados en capacidades que son extremadamente inadecuados para cualquier cosa que implique más de un solo comando. Úselos para hacer una pequeña mutación de un solo comando, nada más.

Dado que la intención es crear un nuevo comando que realiza una operación que internamente se resolverá en otros comandos, la única respuesta correcta es utilizar una función aquí:

lock() { 
    gnome-screensaver 
    gnome-screensaver-command --lock 
} 

uso de alias en un escenario como esto se encuentra con muchos problemas. A diferencia de las funciones, que se ejecutan como comandos, los alias se expanden en el comando actual, lo que generará problemas muy inesperados al combinar este "comando" de alias con otros comandos. Tampoco funcionan en scripts.

  0

Sería mejor si pudiera dar algún ejemplo con su respuesta. esperando la actualización. 15 nov. 172017-11-15 14:40:00


56

Las otras respuestas responden la pregunta adecuadamente, pero su ejemplo parece que el segundo comando depende de que el primero salga exitosamente. Es posible que desee probar un short-circuit evaluation en su alias:

alias lock='gnome-screensaver && gnome-screensaver-command --lock' 

Ahora ni siquiera se intentarse el segundo comando a menos que el primero es un éxito. Se describe una mejor descripción de la evaluación de cortocircuitos en este SO question.

+4

Sorprendentemente, probé esto con 'git fetch && git pull origin master' y no funcionó para mí hasta que reemplacé' && 'con'; '. 25 feb. 142014-02-25 09:42:00

+3

Probablemente porque git fetch devolvió algo más que 0? 12 feb. 152015-02-12 09:53:14

  0

¡Ayudó! El trabajo es para mí en Xubuntu 16.04.3 09 ene. 182018-01-09 12:16:54


0

Tuve un problema al declarar alias en ~/.bashrc. Mi terminal no reconoció los alias que declare en ~/.bashrc. Aprendí del artículo (adjunto en la parte inferior) que Mac OS X ejecuta login-shell de manera predeterminada, por lo tanto llama a ~/.bash_profile en lugar de ~/.bashrc.

en caso de que entren en el mismo problema en declarar sus alias, puede hacer referencia al siguiente enlace para resolver el problema:

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html