Existe-t-il un moyen d'exécuter une commande dans un répertoire différent sans avoir à y cd
? Je sais que je pourrais simplement cd
entrer et cd
sortir, mais je suis juste intéressé par les possibilités de renoncer aux étapes supplémentaires :)
Je ne sais pas si cela compte, mais vous pouvez faire un sous-shell:
$ (cd /var/log && cp -- *.log ~/Desktop)
Le répertoire n'est modifié que pour ce sous-shell, donc vous évitez de devoir cd -
ensuite.
Certains programmes ont des options avec lesquelles vous pouvez leur dire chdir (2) eux-mêmes (par exemple GNU tar de -C
/--directory
).
En dehors de ces programmes, quelque chose devra chdir . Vous pourriez écrire et utiliser une sorte de programme "binaire" compilé au lieu de faire le Shell, mais cela ne donnerait 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"
Puisque le modèle *.log
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 êtes simplement intéressé à ne pas avoir à "revenir en arrière", vous pouvez utiliser un sous-shell pour isoler l'effet du cd de votre instance Shell fonctionnelle .
(cd /path/to/dir && some command)
Vous pouvez empaqueter cela dans une fonction Shell. (J'ai supprimé l'option -d
De votre exemple d'utilisation, car cette commande ne sert à rien si le répertoire est réellement facultatif.)
runindir() { (cd "$1" && shift && eval "$@"); }
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
Ne pas miner la valeur des réponses fournies par d'autres personnes, mais je crois que ce que vous voulez est-ce:
(cd /path/to && ./executable [ARGS])
Notez les parens pour invoquer cd
dans un sous-shell.
Voici quelque chose qui devrait vous laisser cd
revenir où vous étiez (en utilisant Bash), car ne pas oublier de le faire semble être le but de la question:
# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir
run-your-command
# Get back where you were at the beginning.
popd
(EDIT: version légèrement plus courte, grâce à @ Random832)
Malheureusement, votre exemple:
execindirectory -d /var/log "cp *.log ~/Desktop"
n'a pas besoin de changer le répertoire, car
cp /var/log/*.log ~/Desktop
ferait la même chose. Tu ne peux pas te rapprocher de ton vrai problème? Parce que nous pourrions aussi connaître une meilleure solution.
Une façon compliquée de résoudre votre problème, qui est loin de l'élégance de la solution Michaels, est l'utilisation de find, qui a un commutateur '-execdir' à exécuter dans le répertoire, où se trouve un fichier. Mal adopté à votre exemple:
find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"
C'est peut-être utile pour votre vrai problème. -okdir au lieu de -execdir vous demandera de confirmer chaque invocation.
-okdir et -execdir peuvent nécessiter l'installation de gnu-find, qui est généralement utilisé sous Linux.
Que diriez-vous ./your/path/command.sh
?