162 votes

Comment Bash peut-il exécuter une commande dans un contexte de répertoire différent ?

J'ai une commande commune qui est appelée à partir de répertoires très spécifiques. Il n'y a qu'un seul exécutable dans /bin pour ce programme, et le répertoire de travail actuel est très important pour le faire fonctionner correctement. Le script affecte les fichiers qui se trouvent dans le répertoire dans lequel il est exécuté.

J'ai également un shell script personnalisé qui fait certaines choses dans un répertoire, mais j'ai besoin d'appeler la commande mentionnée ci-dessus comme si elle se trouvait dans un autre répertoire.

Comment faire cela dans un shell script ?

339voto

geekosaur Points 26170

Utilisation cd dans une sous-coquille ; les parenthèses sont la façon la plus simple d'utiliser ce type de sous-coquille.

(cd wherever; mycommand ...)

Cela dit, si votre commande a besoin d'un environnement, elle devrait vraiment assurer cet environnement elle-même au lieu d'en faire porter la responsabilité à tout ce qui pourrait vouloir l'utiliser (à moins qu'il ne s'agisse d'une commande interne utilisée dans des circonstances très spécifiques dans le contexte d'un système plus large bien défini, de sorte que tout appelant doive déjà assurer l'environnement dont il a besoin). Habituellement, il s'agirait d'une sorte de shell script.

51voto

bmargulies Points 49855
(cd /path/to/your/special/place;/bin/your-special-command ARGS)

44voto

CodeGnome Points 25402

Vous pouvez utiliser le cd ou l'option pushd y popd à cet effet. Par exemple :

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

Vous utilisez les modules intégrés comme n'importe quelle autre commande, et vous pouvez changer le contexte du répertoire autant de fois que vous le souhaitez dans un script.

30voto

abc123 Points 3550

Si vous souhaitez revenir à votre répertoire de travail actuel :

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. Nous définissons une variable current_dir égal à votre pwd
  2. ensuite, nous allons cd à l'endroit où vous devez exécuter votre commande
  3. puis nous exécutons la commande
  4. alors nous allons cd à notre variable current_dir

Ou

pushd && cd /path/to/your/command/dir && special command ARGS && popd

Avec l'aimable autorisation de @apieceofbart et @Konstantin

0voto

Timo Huovinen Points 8283

Quelques informations utiles :

Le répertoire de l'interpréteur de commandes devient alors ~/project

function mymake() {
    cd ~/project && make $1
}

Ce n'est pas le cas

function mymake() {
    (cd ~/project && make $1)
}

pour courir

mymake something

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X