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 ...
moyen signifient 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 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 prendre aucun argument.
Pour un répertoire et un utilitaire spécifiques , 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 courrais script.sh
situé dans $HOME/somedir
le courant répertoire que le 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 PATH
variable d'environnement, par exemple
PATH="$PATH:$HOME/somedir"
Maintenant , script.sh
en $HOME/somedir
sera en mesure d'être exécuté à partir n'importe où en utilisant simplement
$ script.sh
Encore une fois, cela ne modifie pas le répertoire de travail de la commande.
cdrun () ( cd "$1" && shift && command "$@" )
.