À 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
.
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!]
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.
sh -c 'cd /c && ../a/helloworld'
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
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
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 -
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
Si vous voulez toujours qu'il accède à/C, utilisez un chemin absolu lorsque vous écrivez le fichier.
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.
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...
}
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