web-dev-qa-db-fra.com

Comment puis-je définir un alias bash comme une séquence de plusieurs commandes?

Je sais comment configurer des alias dans bash, mais existe-t-il un moyen de configurer un alias pour une séquence de commandes?

C'est-à-dire que je veux qu'une commande passe à un répertoire particulier, puis exécutez une autre commande.

De plus, existe-t-il un moyen de configurer une commande qui exécute "Sudo mycommand", puis entre le mot de passe? Dans les jours MS-DOS, je rechercherais un fichier .bat mais je ne suis pas sûr de l'équivalent linux (ou dans ce cas Mac OSX).

33
stormist

Vous mentionnez les fichiers BAT, alors peut-être que vous voulez écrire un script Shell. Si c'est le cas, entrez simplement les commandes que vous souhaitez ligne par ligne dans un fichier comme celui-ci:

command1
command2

et demandez à bash d'exécuter le fichier:

bash myscript.sh

Si vous voulez pouvoir appeler le script directement sans taper "bash" alors ajoutez la ligne suivante comme la première ligne du fichier:

#! /bin/bash
command1
command2

Marquez ensuite le fichier comme exécutable:

chmod 755 myscript.sh

Vous pouvez maintenant l'exécuter comme n'importe quel autre exécutable:

./myscript.sh

Notez qu'Unix ne se soucie pas vraiment des extensions de fichiers. Vous pouvez simplement nommer le fichier "myscript" sans l'extension ".sh" si vous le souhaitez. C'est cette première ligne spéciale qui est importante. Par exemple, si vous voulez écrire votre script dans le langage de programmation Perl au lieu de bash, la première ligne serait:

#! /usr/bin/Perl

Cette première ligne indique à votre shell quel interpréteur invoquer pour exécuter votre script.

De plus, si vous copiez maintenant votre script dans l'un des répertoires répertoriés dans la variable d'environnement $ PATH, vous pouvez l'appeler de n'importe où en tapant simplement son nom de fichier:

myscript.sh

Même la complétion par tabulation fonctionne. C'est pourquoi j'inclus habituellement un répertoire ~/bin dans mon $ PATH afin que je puisse facilement installer des scripts personnels. Et mieux encore, une fois que vous avez un tas de scripts personnels que vous avez l'habitude d'avoir, vous pouvez facilement les porter sur n'importe quelle nouvelle machine Unix en copiant votre répertoire personnel ~/bin.

15
slebetman

Pour chaîner une séquence de commandes, essayez ceci:

alias x='command1;command2;command3;'

Ou vous pouvez le faire:

alias x='command1 && command2 && command3'

Le && fait qu'il n'exécute les commandes suivantes que si le précédent retourne avec succès.

Aussi pour entrer des mots de passe de manière interactive, ou interfacer avec d'autres programmes comme ça, consultez attendez-vous. ( http://expect.nist.gov/ )

70
Larry Shatzer

il est probablement plus facile de définir des fonctions pour ces types de choses que les alias, maintient les choses plus lisibles si vous voulez faire plus qu'une commande ou deux:

Dans votre .bashrc

perform_my_command() {
    pushd /some_dir
    my_command "$@"
    popd
}

Ensuite, sur la ligne de commande, vous pouvez simplement faire:

perform_my_command my_parameter my_other_parameter "my quoted parameter"

Vous pouvez faire tout ce que vous voulez dans une fonction, appeler d'autres fonctions, etc.

Vous voudrez peut-être jeter un œil au Advanced Bash Scripting Guide pour une connaissance approfondie.

8
wich

Votre meilleur pari est probablement une fonction Shell au lieu d'un alias si la logique devient plus complexe ou si vous devez ajouter des paramètres (bien que bash supporte les paramètres d'alias).

Cette fonction peut être définie dans votre .profile ou .bashrc. Le sous-shell est d'éviter de changer votre répertoire de travail.

function myfunc {
   ( cd /tmp; command )
}

puis à partir de votre invite de commande

$ myfunc

Pour votre deuxième question, vous pouvez simplement ajouter votre commande à/etc/sudoers (si vous êtes complètement sûr de ce que vous faites)

myuser           ALL = NOPASSWD: \
                    /bin/mycommand 
6
Diego Torres Milano

Pour l'alias, vous pouvez utiliser ceci:

alias sequence='command1 -args; command2 -args;'

ou si la deuxième commande ne doit être exécutée que si la première réussit, utilisez:

alias sequence='command1 -args && command2 -args'
6
gregseth

Apropos plusieurs commandes dans un seul alias, vous pouvez utiliser l'un des opérateurs logiques pour les combiner. En voici une pour passer à un répertoire et faire un ls dessus

      alias x="cd /tmp && ls -al"

Une autre option consiste à utiliser une fonction Shell. Ce sont des commandes sh/zsh/bash. Je ne connais pas suffisamment les autres obus pour être sûr qu'ils fonctionnent.

En ce qui concerne le Sudo, si vous le souhaitez (bien que je ne pense pas que ce soit une bonne idée), la bonne façon de procéder est de modifier le /etc/sudoers fichier pour obtenir ce que vous voulez.

3
Noufal Ibrahim

Vous pouvez incorporer la déclaration de fonction suivie de la fonction dans l'alias lui-même, comme ceci:

alias my_alias='f() { do_stuff_with "$@" (arguments)" ...; }; f'

L'avantage de cette approche par rapport à la simple déclaration de la fonction est que vous pouvez avoir la tranquillité d'esprit que votre fonction ne sera pas remplacée par un autre script que vous recherchez (ou en utilisant .), qui pourrait utiliser son propre assistant sous le même nom.

Par exemple, supposons que vous ayez un script init-my-workspace.sh que vous appelez comme . init-my-workspace.sh ou source init-my-workspace.sh dont le but est de définir ou d'exporter un tas de variables d'environnement (par exemple, Java_HOME, PYTHON_PATH, etc.). S'il vous arrive d'avoir une fonction my_alias à l'intérieur de là aussi, alors vous n'avez pas de chance car la déclaration de fonction dernière avec la même instance de Shell l'emporte.

Inversement, les alias ont un espace de noms distinct et même en cas de conflit de noms, ils sont recherchés en premier. Par conséquent, pour une personnalisation pertinente pour une utilisation interactive, vous ne devez utiliser que des alias.

Enfin, notez que la pratique consistant à placer tous les alias au même endroit (par exemple, ~/.bash_aliases) vous permet de repérer facilement les conflits de noms.

2
eold

vous pouvez également écrire une fonction Shell; exemple pour combo "cd" et "ls" ici

1
B.Kocis