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 l'annuaire /b
. Je veux démarrer mon programme en cours d'exécution ../a/helloworld
et obtenir le hello-world.txt
quelque part dans un troisième répertoire /c
.
linux
shell
environment
Anton Daneyko
la source
la source
su
réinitialise le répertoire de travail dans le répertoire personnel de l'utilisateur que vous spécifiez avant d'exécuter des-c
commandes. Cela m'a été très utile.Réponses:
Appelez le programme comme ceci:
Les parenthèses provoquent la génération d'un sous-shell. Ce sous-shell change alors son répertoire de travail en
/c
, puis s'exécute àhelloworld
partir de/a
. Une fois le programme terminé, le sous-shell se termine, vous renvoyant à l'invite du shell parent, dans le répertoire à partir duquel vous avez démarré.Gestion des erreurs: pour éviter d'exécuter le programme sans avoir changé le répertoire, par exemple en cas d'orthographe
/c
, rendre l'exécution dehelloworld
conditionnelle:Réduction de l'utilisation de la mémoire: pour éviter d'avoir la mémoire perdue du sous-shell pendant l'exécution de hello world, appelez
helloworld
via exec:[Merci à Josh et Juliano d' avoir donné des conseils pour améliorer cette réponse!]
la source
Semblable à la réponse de David Schmitt , plus la suggestion de Josh, mais ne laisse pas de processus shell en cours:
Cette façon est plus similaire à la façon dont vous exécutez habituellement les commandes sur le shell. Pour voir la différence pratique, vous devez exécuter à
ps ef
partir d'un autre shell avec chaque solution.la source
Une option qui ne nécessite pas de sous-shell et est intégrée à bash
Démo:
la source
pushd SOME_PATH && run_stuff && popd
- si run_stuff échoue, alors popd ne va pas être exécuté.set -e
dans le fichier et il échouerapopd
.pushd "${SOME_PATH}" && run_stuff; popd
c'est mieux que la réponse actuelle, car la sémantique pushd / popd a été spécialement conçue pour cette situation d'aller dans un répertoire et de revenir ensuite à l'original.la source
Je pense toujours que les outils UNIX doivent être écrits sous forme de filtres, lire l'entrée depuis stdin et écrire la sortie vers stdout. Si possible, vous pouvez modifier 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
la source
Changez simplement le dernier "&&" en ";" et il reviendra en arrière, peu importe si la commande échoue ou réussit:
la source
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 en cours revient à / b.
Voici un exemple de script shell bash:
la source
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.
la source
run_some_command
échec,cd -
ne sera pas exécuté.Si vous souhaitez toujours qu'il aille dans / C, utilisez un chemin absolu lorsque vous écrivez le fichier.
la source
Si vous souhaitez effectuer cela dans votre programme, je ferais quelque chose comme:
la source
à partir du répertoire en cours fournir le chemin d'accès complet au répertoire de script pour exécuter la commande
la source