Existe-t-il un moyen d'exécuter une commande dans un répertoire différent sans y être cd
obligé? Je sais que je pourrais simplement entrer cd
et cd
sortir, mais je suis simplement intéressé par les possibilités de renoncer aux étapes supplémentaires :)
linux
bash
cd-command
Naftuli Kay
la source
la source
echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory
. Vous aurez peut-être besoin de faire un peu plus d'effort si vous voulez qu'il supporte réellement l'option "tags" tels que-d
and stuff.Réponses:
Je ne sais pas si cela compte, mais vous pouvez créer un sous-shell:
Le répertoire n’est modifié que pour ce sous-shell, vous évitez ainsi de devoir travailler plus
cd -
tard.la source
$ (cd /var/log && cp *.log ~/Desktop)
. Ainsi, si le répertoire n'existe pas, aucune autre commande n'est exécutée.Certains programmes ont des options avec lesquelles vous pouvez indiquer à chdir (2) eux-mêmes (par exemple, GNU tar ’
-C
/--directory
).En dehors de tels programmes, quelque chose devra chdir . Vous pourriez écrire et utiliser une sorte de programme “binaire” compilé au lieu de le faire par le shell, mais cela ne rapporterait probablement pas beaucoup.
Dans un commentaire d'une autre réponse, vous avez donné un exemple:
Comme le
*.log
motif est développé par le shell lui-même (pas cp ), il faudra quelque chose à 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 de votre instance de shell active.
Vous pouvez intégrer cela dans une fonction shell. (J'ai abandonné l'
-d
option de votre exemple d'utilisation car il y a peu d'intérêt pour cette commande si le répertoire est réellement optionnel.)la source
Ne pas saper la valeur des réponses données par d'autres personnes, mais je crois que ce que vous voulez, c'est ceci:
Notez les parenthèses à invoquer
cd
dans un sous-shell.la source
Voici quelque chose qui devrait vous permettre de
cd
retourner où vous étiez (en utilisant Bash), car ne pas oublier de le faire semble être le but de la question:(EDIT: version légèrement plus courte, grâce à @ Random832)
la source
pushd other-dir
, plutôt quepushd .; cd other-dir
Malheureusement, votre exemple:
n'a pas besoin de changement dans le répertoire, car
ferait la même chose. Ne pouvez-vous pas vous rapprocher de votre vrai problème? Parce que nous pourrions connaître une meilleure solution pour cela aussi.
Un moyen compliqué de résoudre votre problème, qui est loin de l'élégance de la solution de Michaels, est l'utilisation de find, qui dispose d'un commutateur '-execdir' à exécuter dans le répertoire où se trouve un fichier. Mal adopté à votre exemple:
Peut-être que c'est 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, généralement utilisé sous Linux.
la source
Que diriez-
./your/path/command.sh
vousla source
execindirectory -d /var/log "cp *.log ~/Desktop"
.