web-dev-qa-db-fra.com

Comment exécuter un programme avec un répertoire de travail différent du shell actuel, du shell Linux?

À l'aide d'un shell Linux, comment démarrer un programme avec un répertoire de travail différent du répertoire de travail actuel?

Par exemple, j'ai un fichier binaire helloworld qui crée le fichier hello-world.txt dans le répertoire en cours. Ce fichier est à l'intérieur du répertoire /a. Actuellement, je suis dans le répertoire /b. Je veux démarrer mon programme avec ../a/helloworld et obtenir le hello-world.txt quelque part dans un troisième répertoire /c.

287
Anton Daneyko

Appelez le programme comme ceci:

(cd /c; /a/helloworld)

Les parenthèses font apparaître un sous-shell. Ce sous-shell change ensuite son répertoire de travail en /c, puis exécute helloworld à partir de /a. Une fois le programme terminé, le sous-shell se termine et vous ramène à votre invite du shell parent, dans le répertoire de départ.

Traitement des erreurs: Pour éviter d'exécuter le programme sans avoir changé de répertoire, par exemple. si /c est mal orthographié, conditionnez l'exécution de helloworld:

(cd /c && /a/helloworld)

Réduction de l'utilisation de la mémoire: Pour éviter que le sous-shell gaspille de la mémoire pendant l'exécution de hello world, appelez helloworld via exec:

(cd /c && exec /a/helloworld)

[Merci à Josh et Juliano pour nous avoir donné des conseils pour améliorer cette réponse!]

475
David Schmitt

Semblable à la réponse de David Schmitt , plus la suggestion de Josh, mais ne laisse pas un processus Shell en marche:

(cd /c && exec /a/helloworld)

Cette façon de procéder ressemble davantage à la manière dont vous exécutez habituellement des commandes sur le shell. Pour voir la différence pratique, vous devez exécuter ps ef à partir d'un autre shell avec chaque solution.

83
Juliano
sh -c 'cd /c && ../a/helloworld'
17
mihi

Une option qui ne nécessite pas de sous-shell et qui est intégrée à bash

(pushd SOME_PATH && run_stuff; popd)

Démo:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
13
Loren

Je pense toujours que les outils UNIX doivent être écrits en tant que filtres, lire les entrées de stdin et écrire les sorties sur stdout. Si possible, vous pouvez changer votre binaire helloworld pour écrire le contenu du fichier texte sur stdout plutôt que sur un fichier spécifique. De cette façon, vous pouvez utiliser le shell pour écrire votre fichier n’importe où.

$ cd ~/b

$ ~/a/helloworld> ~/c/helloworld.txt

11
Luther Blisset

Il suffit de changer le dernier "&&" en ";" et il sera cd, peu importe si la commande échoue ou réussit:

cd SOME_PATH && run_some_command ; cd -
5
johnnybravo

Une façon de faire est de créer un script shell wrapper.

Le script shell modifierait le répertoire actuel en/c, puis exécutera/a/helloworld. Une fois le script Shell terminé, le répertoire en cours revient à/b.

Voici un exemple de script bash shell:

#!/bin/bash
cd /c
/a/helloworld
3
Jin Kim

Si vous voulez toujours qu'il accède à/C, utilisez un chemin absolu lorsque vous écrivez le fichier.

1
Tom Ritter

pourquoi ne pas rester simple

cd SOME_PATH && run_some_command && cd -

la dernière commande 'cd' vous ramènera au dernier répertoire pwd. Cela devrait fonctionner sur tous les systèmes * nix.

1
Sahil

Si vous voulez exécuter ceci dans votre programme, je ferais quelque chose comme:

#include <unistd.h>
int main()
{
  if(chdir("/c") < 0 )  
  {
     printf("Failed\n");
     return -1 ;
  }

  // rest of your program...

}
0
Harold

depuis le répertoire en cours, indiquez le chemin complet du répertoire de script pour exécuter la commande

/root/server/user/home/bin/script.sh
0
Ravi Bhushan