web-dev-qa-db-fra.com

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 puisque je verrouille souvent mon poste de travail, il serait plus facile de taper une seule commande.

182
yuriel

Essayer:

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.

346
mouviciel

Les autres réponses répondent correctement à la question, mais votre exemple ressemble à celui de la seconde commande dépend de la réussite de la première. Vous voudrez peut-être essayer un évaluation de court-circuit dans votre alias:

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

Maintenant, la deuxième commande ne sera même pas tentée à moins que la première ne réussisse. Une meilleure description de l’évaluation des courts-circuits est décrite dans ce question SO .

68
gpojd

Les alias sont destinés à aliasing noms de commande. Au-delà, cela devrait être fait avec des 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 d'origine. ll n'est qu'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 "$1" "$2"
    fi | less
}

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

Techniquement, les alias dans le langage Bash Shell ont des capacités si limitées qu’ils conviennent extrêmement mal à tout ce qui implique plus de ne seule commande. Utilisez-les pour faire une petite mutation d'une commande unique, rien de plus.

Puisque l'intention est de créer une nouvelle commande qui effectue une opération qui sera résolue 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 développés dans la commande en cours, ce qui entraînera des problèmes très inattendus lors de la combinaison de cet alias "commande" avec d'autres commandes. Ils ne fonctionnent pas non plus dans les scripts.

15
lhunath

Est-ce que ça ne marche pas?

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

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

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

Donc utilisez un point-virgule:

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

Cela ne fonctionne pas bien si vous souhaitez fournir des arguments à la première commande. Vous pouvez également créer un script trivial dans votre répertoire $ HOME/bin.

1
Jonathan Leffler

Je seconde l'approche @mouviciel. L'utilisation de ce qui suit fonctionne plutôt bien pour les commandes simples:

alias doSomething='command1; command2'

Pour les commandes nécessitant des arguments, utilisez simplement les fonctions suivantes:

doSomething() {
    command1
    command2 --lock
}
0
wpmoradi