Plusieurs commandes dans un alias pour bash

211

Je voudrais 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.

yuriel
la source

Réponses:

391

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.

mouviciel
la source
7
cela ne devrait-il pas être "function lock () {blah}"?
emeraldjava
2
Comment passez-vous l'argument? L'imbrication de la variable 'msg' lock()entre parenthèses donne l'erreur syntax error near unexpected token msg'` ..
geotheory
8
Une fois la fonction définie, elle se comporte comme une commande: les arguments sont sur la ligne de commande, séparés par des espaces. Dans la partie déclaration, les arguments sont $1, $2... dans le corps de la fonction.
mouviciel
1
Votez pour ne pas inclure la ligne d'alias avec les paramètres.
Philip Rego
2
@PhilipRego - Je serais heureux d'apprendre de vous et de voter positivement.
mouviciel
79

Les autres réponses répondent correctement à la question, mais votre exemple semble que la deuxième commande dépend de la sortie réussie de la première. Vous pouvez essayer une é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 cette question SO .

gpojd
la source
5
Étonnamment, essayé avec git fetch && git pull origin masteret ne fonctionnait pas pour moi jusqu'à ce que je l' ai remplacé &&avec ;.
hakunin
3
Probablement parce que git fetch a retourné autre chose que 0?
RobAu
Aidé! Le travail est pour moi sur Xubuntu 16.04.3
Fernando León
Votez pour ne pas inclure la ligne d'alias avec les paramètres.
Philip Rego
18

Les alias sont destinés à aliaser les noms de commandes. Tout ce qui va au-delà 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. llest 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 "$1" "$2"
    fi | less
}

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

Techniquement, les alias dans le langage shell Bash sont si limités en capacités qu'ils sont extrêmement mal adaptés à tout ce qui implique plus d' une seule commande . Utilisez-les pour faire une petite mutation d'une seule commande, rien de plus.

Étant donné que l'intention est de créer une nouvelle commande qui effectue 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 pose de nombreux problèmes. Contrairement aux fonctions, qui sont exécutées sous forme de commandes, les alias sont étendus dans la commande actuelle, ce qui entraînera des problèmes très inattendus lors de la combinaison de cette "commande" d'alias avec d'autres commandes. Ils ne fonctionnent pas non plus dans les scripts.

lhunath
la source
Il serait préférable que vous puissiez fournir un exemple avec votre réponse. en attente de mise à jour.
Sajid Ali
1
Downvote pour ne pas inclure la ligne d'alias avec les paramètres.
Philip Rego
2
Les alias @PhilipRego ne prennent pas de paramètres. Ne votez pas contre la pomme pour ne pas être orange. Mangez plutôt une orange. Comme la réponse l'explique très bien, le bon outil ici n'est pas les alias mais les fonctions.
lhunath
Je veux dire des paramètres comme celui-ci. J'utilisais mal les guillemets imbriqués. alias = "git commit -m 'init'; git push; git status"
Philip Rego
@PhilipRego Vous avez vraiment besoin d'utiliser une fonction, pas un alias. gps() { git commit -m 'init '; git push; git status; } Comme expliqué, les alias sont extrêmement limités, fragiles et leur seule intention est de renommer les commandes. Les abuser à des fins non liées vous amènera dans l'eau chaude, comme vous venez de le faire.
lhunath
11

Ça ne marche pas?

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

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

alias lock='gnome-screensaver ; gnome-screensaver-command --lock'
Adnan
la source
1

Utilisez donc 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. Sinon, créez un script trivial dans votre répertoire $ HOME / bin.

Jonathan Leffler
la source
0

En ajoutant mes 2 cents à la discussion de 11 ans, essayez ceci:

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

Neenus
la source
0

Ajoutez cette fonction à votre ~/.bashrcet redémarrez votre terminal ou exécutezsource ~/.bashrc

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

De cette façon, ces deux commandes s'exécuteront chaque fois que vous entrerez lockdans votre terminal.

Dans votre cas spécifique, la création d'un aliaspeut fonctionner, mais je ne le recommande pas. Intuitivement, nous penserions que la valeur d'un alias fonctionnerait de la même manière que si vous saisissiez la valeur dans le terminal. Mais ce n'est pas le cas:

Les règles concernant la définition et l'utilisation des alias sont quelque peu confuses.

et

Pour presque tous les usages, les fonctions shell sont préférées aux alias.

N'utilisez donc pas d'alias, sauf si vous le devez. https://ss64.com/bash/alias.html

Philip Rego
la source
-3

J'ai rencontré un problème lors de la déclaration d'alias ~/.bashrc. Mon terminal n'a pas reconnu les alias dans lesquels j'ai déclaré ~/.bashrc. J'ai appris de l'article (joint en bas) que Mac OS X fonctionne login-shellpar défaut, donc il appelle à la ~/.bash_profileplace de ~/.bashrc.

Si vous rencontrez le même problème lors de la déclaration de 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

ToleLee
la source
Ce contrôle qualité concerne plusieurs commandes dans un alias, pas placer les alias.
facuq
J'effectue toujours source .bashrcaprès avoir enregistré les modifications dans le fichier, pour permettre à l'alias d'être reconnu sans se déconnecter.
Scott Fleming