428 Stimmen

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

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

Ich habe zum Beispiel eine Binärdatei helloworld die die Datei hello-world.txt en el aktuelles Verzeichnis .

Diese Datei befindet sich in dem Verzeichnis /a .

Derzeit befinde ich mich im Verzeichnis /b . Ich möchte mein Programm laufen lassen ../a/helloworld und erhalten die hello-world.txt irgendwo in einem dritten Verzeichnis /c .

675voto

David Schmitt Punkte 56455

Rufen Sie das Programm wie folgt 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 aus helloworld de /a . Nach dem Beenden des Programms wird die Sub-Shell beendet und Sie kehren zur Eingabeaufforderung der übergeordneten Shell in dem Verzeichnis zurück, aus dem Sie gestartet sind.

Fehlerbehandlung: Um zu vermeiden, dass das Programm ausgeführt wird, ohne dass das Verzeichnis gewechselt wurde, z. B. bei einer falschen Schreibweise /c machen die Ausführung von helloworld konditioniert:

(cd /c && /a/helloworld)

Verringerung der Speichernutzung: Um zu vermeiden, dass die Subshell Speicher verschwendet, während Hallo Welt ausgeführt wird, rufen Sie helloworld über exec:

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

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

119voto

Juliano Punkte 35709

Ähnlich wie David Schmitt Antwort und Joshs Vorschlag, lässt aber keinen Shell-Prozess laufen:

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

Dieser Weg ähnelt eher der Art und Weise, wie Sie normalerweise Befehle auf der Shell ausführen. Um den praktischen Unterschied zu sehen, müssen Sie Folgendes ausführen ps ef aus einer anderen Schale mit jeder Lösung.

38voto

Loren Punkte 3873

Eine Option, die keine Subshell benötigt und in die Bash eingebaut ist

(pushd SOME_PATH && run_stuff; popd)

Demo:

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

22voto

mihi Punkte 6211
sh -c 'cd /c && ../a/helloworld'

15voto

johnnybravo Punkte 101

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

cd SOME_PATH && run_some_command ; cd -

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X