Múltiples comandos en un alias para bash

211

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

gnome-screensaver
gnome-screensaver-command --lock

Ahora mismo he añadido

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

a mi .bashrc, pero dado que bloqueo mi estación de trabajo con tanta frecuencia, sería más fácil escribir un solo comando.

yuriel
fuente

Respuestas:

391

Tratar:

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

o

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

en tu .bashrc

La segunda solución le permite usar argumentos.

Mouviciel
fuente
77
¿No debería ser "function lock () {blah}"?
emeraldjava
2
¿Cómo pasas el argumento? Anidar variable 'msg' dentro de lock()paréntesis da error msg'' syntax error near unexpected token ..
geotheory
8
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 la declaración, los argumentos son $1, $2... en el cuerpo de la función.
Mouviciel
1
Voto negativo por no incluir la línea de alias con params.
Philip Rego
2
@PhilipRego: me gustaría saber de usted y votar su respuesta.
mouviciel
79

Las otras respuestas responden la pregunta adecuadamente, pero su ejemplo parece que el segundo comando depende de que el primero salga con éxito. Es posible que desee probar una evaluación de cortocircuito en su alias:

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

Ahora el segundo comando ni siquiera se intentará a menos que el primero sea exitoso. Una mejor descripción de la evaluación de cortocircuito se describe en esta pregunta SO .

gpojd
fuente
55
Sorprendentemente, este tratado con git fetch && git pull origin mastery no funcionó para mí hasta que sustituye &&a ;.
Hakunin
3
¿Probablemente porque git fetch devolvió algo más que 0?
RobAu
¡Ayudado! El trabajo es para mí en Xubuntu 16.04.3
Fernando León
Voto negativo por no incluir la línea de alias con params.
Philip Rego
18

Los alias están destinados a alias de nombres de comandos. 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. lles solo un tipo ligeramente específico de ls.

d() {
    if exists colordiff; then
        colordiff -ur "$@"
    elif exists diff; then
        diff -ur "$@"
    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. Realiza operaciones internas.

Técnicamente, los alias en el lenguaje de shell Bash tienen capacidades tan limitadas 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 realice una operación que se resolverá internamente en otros comandos, la única respuesta correcta es usar una función aquí:

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

El uso de alias en un escenario como este se encuentra con muchos problemas. Al contrario 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 guiones.

lhunath
fuente
Sería mejor si pudiera dar algún ejemplo con su respuesta. esperando actualización
Sajid Ali
1
Voto negativo por no incluir la línea de alias con params.
Philip Rego
2
Los alias @PhilipRego no toman parámetros. No rechaces la manzana por no ser naranja. Come una naranja en su lugar. Como la respuesta explica muy bien, la herramienta correcta aquí no son los alias sino las funciones.
lhunath
Me refiero a parámetros como este. Estaba usando citas anidadas mal. alias = "git commit -m 'init'; git push; estado de git"
Philip Rego
@PhilipRego Realmente necesitas usar una función, no un alias. gps() { git commit -m 'init '; git push; git status; } Como se explicó, los alias son extremadamente limitados, frágiles y su única intención es cambiar el nombre de los comandos. Abusar de ellos para fines no relacionados lo llevará a aguas calientes, como acaba de experimentar.
lhunath
11

¿Esto no funciona?

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock'
Sean Bright
fuente
4

Esto ejecutaría los 2 comandos uno tras otro:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'
Adnan
fuente
1

Entonces 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. Alternativamente, cree un script trivial en su directorio $ HOME / bin.

Jonathan Leffler
fuente
0

Agregando mis 2 centavos a la discusión de 11 años intente esto:

alias lock="gnome-screensaver \gnome-screensaver-command --lock"

Neeno
fuente
0

Agregue esta función a su ~/.bashrcy reinicie su terminal o ejecutesource ~/.bashrc

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

De esta manera, estos dos comandos se ejecutarán cada vez que ingrese locken su terminal.

En su caso específico, crear un aliaspuede funcionar, pero no lo recomiendo. Intuitivamente, pensaríamos que el valor de un alias se ejecutaría igual que si ingresara el valor en la terminal. Sin embargo, ese no es el caso:

Las reglas relativas a la definición y uso de alias son algo confusas.

y

Para casi todos los propósitos, las funciones de shell son preferibles a los alias.

Así que no uses un alias a menos que sea necesario. https://ss64.com/bash/alias.html

Philip Rego
fuente
-3

Encontré un problema al declarar alias en ~/.bashrc. Mi terminal no reconoció los alias que declaró ~/.bashrc. Aprendí del artículo (adjunto en la parte inferior) que Mac OS X se ejecuta login-shellpor defecto, por lo tanto, llama en ~/.bash_profilelugar de ~/.bashrc.

Si tiene el mismo problema al declarar sus alias, puede consultar el siguiente enlace para resolver el problema:

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

ToleLee
fuente
Este control de calidad trata sobre varios comandos en un alias, no dónde colocar los alias.
facuq
Siempre realizo source .bashrcdespués de guardar los cambios en el archivo, para permitir que se reconozca el alias sin cerrar sesión.
Scott Fleming