Je ne sais pas si cela compte, mais vous pouvez créer un sous-shell :
$ (cd /var/log && cp -- *.log ~/Desktop)
Le répertoire n'est modifié que pour ce sous-shell, vous évitant ainsi d'avoir à cd -
après.
Certains programmes ont des options avec lesquelles vous pouvez leur dire de chdir(2) eux-mêmes (par exemple GNU tar -C
de /--directory
).
En dehors de ces programmes cependant, quelque chose devra chdir . Vous pourriez écrire et utiliser une sorte de programme "binaire" compilé au lieu de laisser le shell le faire, mais cela n'apporterait probablement pas beaucoup d'avantages.
Dans un commentaire dans une autre réponse, vous avez donné un exemple :
execindirectory -d /var/log "cp *.log ~/Desktop"
Depuis le *.log
le motif est développé par le shell lui-même (pas cp ), quelque chose devra chdir dans le répertoire avant qu'un shell évalue votre commande.
Si vous souhaitez simplement éviter d'avoir à "cd back", vous pouvez utiliser un sous-shell pour isoler l'effet du cd à partir de votre instance de shell de travail.
(cd /path/to/dir && some command)
Vous pouvez empaqueter cela dans une fonction shell. (J'ai laissé tomber le -d
option de votre exemple d'utilisation car il n'y a pas grand intérêt à cette commande si le répertoire est en fait facultatif.)
runindir() { (cd "$1" && shift && eval "[email protected]"); }
runindir /var/log 'cp *.log ~/Desktop' # your example
runindir /var/log cp \*.log \~/Desktop # eval takes multiple args
runindir /var/log cp \*.log ~/Desktop # it is okay to expand tilde first
Je ne veux pas nuire à la valeur des réponses données par d'autres personnes, mais je crois que ce que vous voulez est ceci :
(cd /path/to && ./executable [ARGS])
Notez les parenthèses pour invoquer cd
dans un sous-shell.