J'ai un .bash_profile
et en ce que j'ai un ensemble d'alias. Ces alias n'exécutent actuellement qu'une seule commande et c'était assez facile. Je voudrais cependant faire deux choses avec un nouvel alias que j'essaie de créer.
Pour exécuter une commande avec un répertoire de travail spécifique, on fait généralement
( cd directory && utility )
Les parenthèses autour du cd ...
signifie que la ou les commandes qui s'y trouvent s'exécutent en sous-shell. La modification du répertoire de travail dans un sous-shell fait en sorte que le répertoire de travail actuel du shell appelant ne soit pas modifié, c'est-à-dire qu'après avoir appelé cette commande, vous serez toujours situé dans le même répertoire que celui où vous avez commencé.
Exemple:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
Cela ne peut pas être transformé en un alias générique car un alias ne peut accepter aucun argument.
Pour un répertoire et un utilitaire spécifique, on pourrait faire
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
mais pour le cas général, vous devrez utiliser une fonction Shell:
cdrun () {
( cd "$1" && shift && command "$@" )
}
ou
cdrun () (
cd "$1" && shift && command "$@"
)
Le remplacement des accolades par des parenthèses autour du corps de la fonction fait exécuter la fonction dans son propre sous-shell.
Ce serait utilisé comme
$ cdrun "$HOME/somedir" ./script.sh
qui exécuterait le script script.sh
situé dans le répertoire $HOME/somedir
, avec $HOME/somedir
comme répertoire de travail, ou
$ cdrun / ls -l
qui vous fournirait une liste de répertoires au "format long" du répertoire racine.
La fonction Shell prend son premier argument et essaie de passer à ce répertoire. Si cela fonctionne, il décale le nom du répertoire des paramètres positionnels (la liste des arguments de la ligne de commande) et exécute la commande donnée par le reste des arguments. command
est une commande intégrée dans le Shell qui exécute simplement ses arguments en tant que commande.
Tout cela est nécessaire si vous souhaitez exécuter une commande avec un répertoire de travail modifié. Si vous souhaitez simplement exécuter une commande située ailleurs, vous pouvez évidemment utiliser
alias thing='$HOME/somedir/script.sh'
mais cela fonctionnerait script.sh
situé dans $HOME/somedir
avec le répertoire actuel comme répertoire de travail.
Une autre façon d'exécuter un script situé ailleurs sans modifier le répertoire de travail consiste à ajouter l'emplacement du script à votre variable d'environnement PATH
, par exemple.
PATH="$PATH:$HOME/somedir"
Maintenant script.sh
dans $HOME/somedir
pourra être exécuté de n'importe où en utilisant simplement
$ script.sh
Encore une fois, cela ne pas change le répertoire de travail de la commande.
alias <name-of-the-alias>='cd <the-directory> && <command>'
Donc, si vous voulez changer de répertoire (cd) dans le dossier /var/log/
puis listez (ls) ses fichiers que vous pouvez ajouter dans votre .bash_profile
déposer ce qui suit:
alias logs='cd /var/log/ && ls'
J'utilise cette fonction pour exécuter une seule commande dans un répertoire différent:
cd1 () {
if [ $# -eq 1 ]; then
command cd -- "$1"
else
( command cd -- "$1" && shift && "$@" )
fi
}
Une limitation de cette fonction est que les caractères génériques sont terminés par rapport au répertoire d'origine, et non par rapport au répertoire où la commande s'exécute. Il est possible de faire mieux en zsh .
Cette fonction agit comme le cd
ordinaire si elle est appelée avec un seul argument, vous pouvez donc l'appeler cd
. (Cette fonction ne prend en charge aucune option, mais les options de cd
sont rarement utilisées.)
Séparez les commandes par un point-virgule, par exemple:
alias do_something='cd /tmp; ls'