¿Cómo configuro un alias para una línea de terminal?

9

Quiero establecer fácilmente un alias git-gopara esta línea de terminal:

git commit -m "init "; git push; git status

Entonces, cuando ingreso git-go, esta línea debería ingresar.

¿Cómo puedo hacer eso? Las respuestas que vi solo cubren el alias de un comando sin parámetros. Pero quiero establecer un alias en una línea terminal arbitraria.

Philip Rego
fuente
¿Qué intentaste? ¿Qué otras preguntas leíste? askubuntu.com/q/17536/507051 lo explica bastante bien, ¿cuál es exactamente su pregunta?
postre
Mi problema fue usar comillas dobles en lugar de simples para las comillas externas.
Philip Rego
También podría hacerlo al revés usando comillas dobles en el exterior y comillas simples en el interior.
Videonauth
3
Posible duplicado de ¿Cómo creo un alias Bash permanente?
Fabby

Respuestas:

13

Haces esto de la misma manera que establecerías cualquier alias.

alias git-go='git commit -m "init "; git push; git status'

La situación en la que se vuelve difícil no es cuando un alias ejecuta un comando y pasa argumentos a ese comando, ni siquiera cuando un alias ejecuta múltiples comandos separados por ;, sino que es cuando desea que un alias acepte y use sus propios argumentos de línea de comandos .

Por ejemplo, todo lo que escriba después del nombre de ese alias se pegará al final y, por lo tanto, se pasará como argumentos de línea de comando al tercer gitcomando, después git status. (Realmente no es tanto que el siguiente texto se pegue al final, sino que se deja solo el texto siguiente y el nombre del alias se reemplaza por su definición).

Entonces puede ejecutar su alias sin argumentos, lo que funciona, y el último comando es git status:

git-go

O puede ejecutarlo con argumentos a los que desea pasar git status. Por ejemplo, cuando lo ejecuta de esta manera, el último comando es git-status --show-stash:

git-go --show-stash

Lo que no puede hacer con un alias en Bash (y otros shells de estilo Bourne) es hacer que el alias acepte argumentos de línea de comandos y los coloque en otro lugar que no sea el final.

Por ejemplo, suponga que desea git-goaceptar un argumento que utiliza para el mensaje de confirmación. No podría escribir esto como un alias. La solución sería escribirlo como una función de shell en su lugar:

git-go() { git commit -m "$1"; git push; git status; }

En la definición de una función de shell, los parámetros posicionales $1, $2etc., contienen los valores de los argumentos de la línea de comandos pasados ​​a la función de shell. Los alias no tienen una funcionalidad que corresponda a esto, porque la expansión de alias es realmente una forma de macroprocesamiento, que tiene lugar muy temprano, cuando el shell analiza un comando.

Por supuesto, puede escribirlo como una función de shell incluso si no necesita usar parámetros posicionales en la definición, como sugiere Videonauth .

Eliah Kagan
fuente
1
Aún mejor: coloque un script nombrado git-goen su RUTA y git gofuncionará.
D. Ben Knoble
10

Puede declararlo una función en su ~/.bash_aliasesarchivo de la siguiente manera:

git-go(){
    git commit -m "init "
    git push
    git status
}

o puede crear un alias en el mismo archivo así:

alias git-go='git commit -m "init "; git push; git status'

No olvide volver a abrir su terminal o obtener el archivo ( . ~/.bash_aliases) después de haberlo cambiado.

Videonauth
fuente
1
Una ventaja de escribir una función de shell en lugar de un alias es que no es necesario anidar comillas. Por lo tanto, esta respuesta aborda el problema central que el OP resultó tener más directamente que el mío.
Eliah Kagan
@EliahKagan Ambos están bien para esa pregunta, aunque la tuya es más completa. Es bueno verte de vuelta.
Videonauth
4

Como se trata de gitcomandos, es posible que también desee conocer la sintaxis para agregar un alias, especialmente para git:

git config --global alias.go '!sh -c "git commit -m \"init\"; git push; git status"'

Esto agregará un nuevo alias a su gitconfiguración local (at ~/.gitconfig) y le permitirá emitir

git go

cuando dentro de un gitrepositorio. Cada vez que ejecuta git goun shell se invoca y git commit -m "init"; git push; git statusse le pasa el comando .

Vea la documentación de git para más detalles.

PerlDuck
fuente
3

Fue un problema de citas. Había intentado esto:

alias="git commit -m "init "; git push; git status"

Pero tengo este error:

bash: ; git push; git status: command not found

Obtuve ese error porque estaba usando comillas anidadas incorrectamente. Aquí está la sintaxis correcta:

alias='git commit -m "init "; git push; git status'

O:

alias="git commit -m 'init '; git push; git status"

O sin comillas si no hay espacios en blanco en el mensaje de confirmación:

alias="git commit -m init; git push; git status"
Philip Rego
fuente
Gracias por publicar esta respuesta (ya que mi respuesta y la de Videonauth no se centran mucho en el tema de las citas). Por curiosidad, ¿por qué querías un espacio final en tus mensajes de confirmación?
Eliah Kagan
Solía ​​pegar manualmente esta línea y agregaba un mensaje después del espacio, pero eso no tiene sentido aquí, así que lo eliminé.
Philip Rego
1
En ese caso, no necesita citar init; los dulces de la cáscara 'init', "init"y initel mismo. (Por lo tanto, es posible que desee volver a colocar la versión original y también mostrar la nueva versión, para ilustrar la situación en la que se necesitan comillas anidadas). En cuanto a poder agregar el resto del mensaje, puede pasarlo como una línea de comandos argumento si (como se muestra en Videonauth y mis respuestas) definió una función en lugar de un alias. Por ejemplo, podría definir git-go() { git commit -m "init $1"; git push; git status; }(que es lo que tengo en mi respuesta pero con en "init $1"lugar de solo "$1").
Eliah Kagan
Gracias, eso es lo que quería probar a continuación.
Philip Rego