web-dev-qa-db-fra.com

Exécuter une commande spécifique dans un répertoire donné sans y accéder?

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 :)

43
Naftuli Kay

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.

56
Michael Mrozek

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
14
Chris Johnsen

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.

11
alex

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)

4
Bruno

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.

2
user unknown

Que diriez-vous ./your/path/command.sh?

1
bdictator