Plusieurs commandes dans un alias pour bash

j'aimerais définir un alias qui exécute les deux commandes suivantes consécutivement.

gnome-screensaver
gnome-screensaver-command --lock

en ce moment j'ai ajouté

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

à mon .bashrc mais comme je verrouille mon poste de travail si souvent, il serait plus facile de taper une seule commande.

152
demandé sur yuriel 2009-04-16 19:47:33

7 réponses

, Essayez:

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

ou

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

dans votre .bashrc

la deuxième solution vous permet d'utiliser des arguments.

292
répondu mouviciel 2009-04-16 15:51:10

les autres réponses répondent à la question correctement, mais votre exemple ressemble à la deuxième commande dépend de la première étant sortie avec succès. Vous pouvez essayer un évaluation de court-circuit dans votre alias:

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

maintenant le second commandement ne sera même pas tenté à moins que le premier ne soit réussi. Une meilleure description de l'évaluation des courts-circuits est décrite dans la question .

60
répondu gpojd 2017-05-23 12:10:41
Les alias

sont destinés à et à . En dehors de cela devrait être fait avec les fonctions.

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

sont des noms qui sont toujours associés au nom original. ll est juste un type légèrement spécifique de ls .

d() {
    if exists colordiff; then
        colordiff -ur "$@"
    elif exists diff; then
        diff -ur "$@"
    elif exists comm; then
        comm -3 "" ""
    fi | less
}

une fonction est Une nouvelle commande qui a sa logique interne. Ce n'est pas simplement un changement de nom d'une autre commande. Il n'opérations internes.

techniquement, les alias en langage shell Bash sont si limités en capacités qu'ils sont extrêmement mal adaptés pour tout ce qui implique plus que une seule commande . Les utiliser pour faire une petite mutation d'un seul commandement, rien de plus.

puisque l'intention est de créer une nouvelle commande qui exécute une opération qui se résoudra en interne dans d'autres commandes, la seule réponse correcte est d'utiliser une fonction ici:

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

L'utilisation d'alias dans un scénario comme celui-ci se heurte à de nombreux problèmes. Contrairement aux fonctions, qui sont exécutées en tant que commandes, les alias sont étendus à la commande courante, ce qui entraînera des problèmes très inattendus lors de la combinaison de cet alias "command" avec d'autres commandes. Ils ne fonctionnent pas non plus dans les scripts.

12
répondu lhunath 2017-11-16 17:44:07

ça ne marche pas?

alias whatever='gnome-screensaver ; gnome-screensaver-command --lock'
11
répondu Sean Bright 2009-04-16 15:50:32

cela exécuterait les 2 commandes l'une après l'autre:

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'
4
répondu Adnan 2009-04-16 15:50:54

utilisez donc un point-virgule:

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

Cela ne fonctionne pas bien si vous voulez fournir des arguments à la première commande. Alternativement, créez un script trivial dans votre répertoire $HOME/bin.

2
répondu Jonathan Leffler 2009-04-16 15:51:09

j'ai eu un problème en déclarant des alias dans ~/.bashrc . Mon terminal n'a pas reconnu les alias que j'ai déclarés dans ~/.bashrc . J'ai appris de l'article (ci-joint sur le bas) que Mac OS X exécute login-shell par défaut donc il appelle ~/.bash_profile au lieu de ~/.bashrc .

si vous rencontrez le même problème en déclarant vos Alias, vous pouvez vous référer au lien suivant pour résoudre le problème:

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

-1
répondu Anthony 2017-01-21 03:11:04