Comment puis-je exécuter un programme avec un répertoire de travail différent de current, de Linux shell?
En utilisant 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 courant. Ce fichier se trouve dans le répertoire /a
. Actuellement, je suis dans le répertoire /b
. Je veux commencer mon programme en cours d'exécution ../a/helloworld
et obtenir le hello-world.txt
quelque part dans un troisième répertoire /c
.
11 réponses
Appelez le programme comme ceci:
(cd /c; /a/helloworld)
Les parenthèses provoquent l'apparition d'un sous-shell. Ce sous-shell change ensuite son répertoire de travail en /c
, puis exécute helloworld
à partir de /a
. Après la sortie du programme, le sous-shell se termine, vous renvoyant à votre invite du shell parent, dans le répertoire à partir duquel vous avez commencé.
Gestion des erreurs: pour éviter d'exécuter le programme sans avoir modifié le répertoire, par exemple en ayant mal orthographié /c
, effectuez l'exécution de helloworld
conditionnel:
(cd /c && /a/helloworld)
Réduction de l'utilisation de la mémoire: pour éviter que la mémoire du sous-shell ne soit gaspillée pendant l'exécution de hello world, appelez helloworld
via exec:
(cd /c && exec /a/helloworld)
[merci à Josh et Juliano {[23] } pour avoir donné des conseils sur l'amélioration de cette réponse!]
Similaire à la réponse de David Schmitt , Plus La suggestion de Josh, mais ne laisse pas un processus shell en cours d'exécution:
(cd /c && exec /a/helloworld)
Cette façon est plus similaire à la façon 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.
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 l'entrée de stdin et écrire la sortie vers stdout. Si possible, vous pouvez changer votre binaire helloworld pour écrire le contenu du fichier texte en stdout plutôt qu'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 reviendra sur cd peu importe si la commande échoue ou réussit:
cd SOME_PATH && run_some_command ; cd -
Une façon de le faire est de créer un script shell wrapper.
Le script shell changerait le répertoire courant en /c, puis exécuterait /a / helloworld. Une fois le script shell terminé, le répertoire courant revient à /B.
Voici un exemple de script shell bash:
#!/bin/bash
cd /c
/a/helloworld
Si vous voulez toujours qu'il aille dans /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 effectuer cela dans votre programme, alors je ferais quelque chose comme:
#include <unistd.h>
int main()
{
if(chdir("/c") < 0 )
{
printf("Failed\n");
return -1 ;
}
// rest of your program...
}
À partir du répertoire courant, indiquez le chemin d'accès complet au répertoire de script pour exécuter la commande
/root/server/user/home/bin/script.sh