Comment définir un alias sur une ligne de terminal?

9

Je veux facilement définir un alias git-gopour cette ligne de terminal:

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

Donc, quand j'entre dans git-go, cette ligne doit entrer.

Comment puis je faire ça? Les réponses que j'ai vues ne couvrent que l'alias d'une commande sans paramètres. Mais je veux définir un alias sur une ligne de terminal arbitraire.

Philip Rego
la source
Qu'avez-vous essayé? Quelles autres questions avez-vous lues? askubuntu.com/q/17536/507051 l' explique assez bien, quelle est exactement votre question?
dessert
Mon problème était d'utiliser des guillemets doubles au lieu de simples pour les citations extérieures.
Philip Rego
Vous pourriez aussi bien le faire dans l'autre sens en utilisant des guillemets doubles à l'extérieur et des guillemets simples à l'intérieur.
Videonauth
3
Copie possible de Comment créer un alias Bash permanent?
Fabby

Réponses:

13

Vous procédez de la même manière que vous définiriez n'importe quel alias.

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

La situation où cela devient délicat n'est pas lorsqu'un alias exécute une commande et passe des arguments à cette commande, ni même lorsqu'un alias exécute plusieurs commandes séparées par ;, mais plutôt lorsque vous voulez qu'un alias accepte et utilise ses propres arguments de ligne de commande .

Par exemple, tout ce que vous écrivez après le nom de cet alias sera collé à la fin, et donc passé comme arguments de ligne de commande à la troisième gitcommande, après git status. (Vraiment, ce n'est pas tant que le texte suivant est collé à la fin, mais plutôt que le texte suivant est laissé seul et que le nom d'alias est remplacé par sa définition.)

Vous pouvez donc exécuter votre alias sans arguments, ce qui fonctionne, et la dernière commande est git status:

git-go

Ou vous pouvez l'exécuter avec les arguments que vous souhaitez transmettre git status. Par exemple, lorsque vous l'exécutez de cette façon, la dernière commande est git-status --show-stash:

git-go --show-stash

Ce que vous ne pouvez pas faire avec un alias dans Bash (et d'autres shells de style Bourne), c'est de faire en sorte que l'alias accepte les arguments de ligne de commande et les place ailleurs qu'à la fin.

Par exemple, supposons que vous vouliez git-goaccepter un argument qu'il utilise pour le message de validation. Vous ne pourriez pas écrire ceci en tant qu'alias. La solution serait de l'écrire en tant que fonction shell à la place:

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

Dans la définition d'une fonction d'enveloppe, les paramètres de position $1, $2et ainsi de suite maintiennent les valeurs des arguments de ligne de commande transmis à la fonction d'enveloppe. Les alias n'ont aucune fonctionnalité qui correspond à cela, car l'expansion des alias est vraiment une forme de traitement de macro, qui a lieu très tôt, lorsque le shell analyse une commande.

Vous pouvez bien sûr l'écrire en tant que fonction shell même si vous n'avez pas besoin d'utiliser des paramètres de position dans la définition, comme le suggère Videonauth .

Eliah Kagan
la source
1
Encore mieux: placez un script nommé git-godans votre CHEMIN et git gocela fonctionnera.
D. Ben Knoble
10

Vous pouvez le déclarer une fonction dans votre ~/.bash_aliasesfichier comme ceci:

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

ou vous pouvez créer un alias dans le même fichier comme ceci:

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

N'oubliez pas de rouvrir votre terminal ou de source le fichier ( . ~/.bash_aliases) après l'avoir modifié.

Videonauth
la source
1
L'un des avantages de l'écriture d'une fonction shell au lieu d'un alias est qu'il n'est pas nécessaire d'imbriquer les guillemets. Cette réponse répond donc au problème central que le PO s'est révélé avoir plus directement que le mien.
Eliah Kagan
@EliahKagan Les deux sont bien pour cette question bien que la vôtre soit plus partout. Ravi de vous revoir.
Videonauth
4

Comme vous traitez des gitcommandes, vous voudrez peut-être également connaître la syntaxe pour ajouter un alias, en particulier pour git:

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

Cela ajoutera un nouvel alias à votre gitconfiguration locale (at ~/.gitconfig) et vous permettra d'émettre

git go

à l'intérieur d'un gitréférentiel. Chaque fois que vous exécutez git goun shell est invoqué et la commande lui git commit -m "init"; git push; git statusest passée.

Voir la documentation de git pour plus de détails.

PerlDuck
la source
3

C'était un problème de citation. J'avais essayé ceci:

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

Mais j'ai cette erreur:

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

J'ai eu cette erreur parce que j'utilisais mal les guillemets imbriqués. Voici la syntaxe correcte:

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

Ou:

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

Ou sans guillemets si aucun espace blanc dans le message de validation:

alias="git commit -m init; git push; git status"
Philip Rego
la source
Merci d'avoir posté cette réponse (car ma réponse et celle de Videonauth ne se concentrent pas beaucoup sur le problème des citations). Par curiosité, pourquoi vouliez-vous un espace de fin dans vos messages de commit?
Eliah Kagan
J'avais l'habitude de coller manuellement cette ligne et j'ajouterais un message après l'espace, mais cela n'a pas de sens ici, donc je l'ai retiré.
Philip Rego
1
Dans ce cas, vous n'avez pas besoin de citer init; les friandises de coque 'init', "init"et initle même. (Donc, vous voudrez peut-être remettre la version d'origine et également montrer la nouvelle version, pour illustrer la situation où des guillemets imbriqués sont nécessaires.) Quant à pouvoir ajouter le reste du message, vous pouvez le passer en ligne de commande argument si (comme indiqué dans Videonauth et mes réponses) vous avez défini une fonction au lieu d'un alias. Par exemple, vous pouvez définir git-go() { git commit -m "init $1"; git push; git status; }(c'est ce que j'ai dans ma réponse mais avec "init $1"au lieu de juste "$1").
Eliah Kagan
Merci, c'est ce que je voulais essayer ensuite.
Philip Rego