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.

275
demandé sur Mark Amery 2009-04-24 19:36:23

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!]

454
répondu David Schmitt 2017-05-23 11:33:24

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.

83
répondu Juliano 2017-05-23 12:03:09
sh -c 'cd /c && ../a/helloworld'
17
répondu mihi 2015-05-02 23:38:20

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
11
répondu Loren 2016-11-29 01:47:28

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

10
répondu Luther Blisset 2009-04-24 17:15:27

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 -
5
répondu johnnybravo 2016-03-29 08:10:45

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
3
répondu Jin Kim 2009-04-24 15:46:04

Si vous voulez toujours qu'il aille dans /C, utilisez un chemin absolu lorsque vous écrivez le fichier.

1
répondu Tom Ritter 2009-04-24 15:40:18

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
répondu Sahil 2015-01-02 03:27:56

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...

}
0
répondu Harold 2009-04-24 16:16:50

À 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
0
répondu Ravi Bhushan 2017-06-20 10:23:23