it-swarm.com.de

Wie führe ich ein Programm mit einem anderen Arbeitsverzeichnis als dem aktuellen aus der Linux-Shell aus?

Wie starte ich mit einer Linux-Shell ein Programm mit einem anderen Arbeitsverzeichnis als dem aktuellen Arbeitsverzeichnis?

Zum Beispiel habe ich eine Binärdatei helloworld, die die Datei hello-world.txt im aktuellen Verzeichnis erstellt. Diese Datei befindet sich im Verzeichnis /a. Derzeit bin ich im Verzeichnis /b. Ich möchte mit meinem Programm ../a/helloworld starten und den hello-world.txt irgendwo in ein drittes Verzeichnis /c holen.

287
Anton Daneyko

Rufe das Programm so auf:

(cd /c; /a/helloworld)

Die Klammern bewirken, dass eine Sub-Shell erzeugt wird. Diese Sub-Shell ändert dann ihr Arbeitsverzeichnis in /c und führt dann helloworld von /a aus. Nachdem das Programm beendet wurde, wird die Sub-Shell beendet und Sie kehren zu Ihrer Eingabeaufforderung der übergeordneten Shell in dem Verzeichnis zurück, von dem aus Sie begonnen haben.

Fehlerbehandlung: Um zu vermeiden, dass das Programm ausgeführt wird, ohne das Verzeichnis zu ändern, z. Wenn Sie /c falsch geschrieben haben, machen Sie die Ausführung von helloworld bedingt:

(cd /c && /a/helloworld)

Reduzieren Sie die Speichernutzung: Um zu vermeiden, dass während der Ausführung von hallo world der Subshell-Speicher verschwendet wird, rufen Sie helloworld über exec auf:

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

[Dank an Josh und Juliano für Tipps zur Verbesserung dieser Antwort!]

475
David Schmitt

Ähnlich wie die Antwort von David Schmitt , plus Joshs Vorschlag, ohne jedoch einen Shell-Prozess auszuführen:

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

Diese Vorgehensweise ähnelt eher der normalen Ausführung von Befehlen in der Shell. Um den praktischen Unterschied zu erkennen, müssen Sie mit jeder Lösung ps ef von einer anderen Shell aus ausführen.

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

Eine Option, die keine Subshell erfordert und in bash integriert ist

(pushd SOME_PATH && run_stuff; popd)

Demo:

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

Ich denke immer, UNIX-Tools sollten als Filter geschrieben werden, Eingaben von stdin lesen und Ausgaben in stdout schreiben. Wenn möglich, können Sie Ihre helloworld-Binärdatei so ändern, dass der Inhalt der Textdatei in stdout und nicht in eine bestimmte Datei geschrieben wird. Auf diese Weise können Sie die Shell verwenden, um Ihre Datei überall zu schreiben.

$ cd ~/b

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

11
Luther Blisset

Ändern Sie einfach das letzte "&&" in ";" und es wird zurückgegeben, egal ob der Befehl fehlschlägt oder erfolgreich ist:

cd SOME_PATH && run_some_command ; cd -
5
johnnybravo

Eine Möglichkeit, dies zu tun, besteht darin, ein Wrapper-Shell-Skript zu erstellen.

Das Shell-Skript würde das aktuelle Verzeichnis in/c ändern und dann/a/helloworld ausführen. Sobald das Shell-Skript beendet ist, wird das aktuelle Verzeichnis wieder auf/b zurückgesetzt.

Hier ein Beispiel für ein Bash-Shell-Skript:

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

Wenn Sie immer möchten, dass es nach/C geht, verwenden Sie beim Schreiben der Datei einen absoluten Pfad.

1
Tom Ritter

warum nicht einfach halten

cd SOME_PATH && run_some_command && cd -

der letzte 'cd'-Befehl bringt Sie zurück zum letzten pwd-Verzeichnis. Dies sollte auf allen * nix-Systemen funktionieren.

1
Sahil

Wenn Sie dies in Ihrem Programm ausführen möchten, würde ich Folgendes tun:

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

  // rest of your program...

}
0
Harold

geben Sie im aktuellen Verzeichnis den vollständigen Pfad zum Skriptverzeichnis an, um den Befehl auszuführen

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