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 mein Programm starten ../a/helloworld
und das hello-world.txt
irgendwo in einem dritten Verzeichnis abrufen /c
.
linux
shell
environment
Anton Daneyko
quelle
quelle
su
das Arbeitsverzeichnis auf das von Ihnen angegebene Ausgangsverzeichnis des Benutzers zurückgesetzt wird, bevor-c
Befehle ausgeführt werden. Das war sehr hilfreich für mich.Antworten:
Rufen Sie das Programm folgendermaßen auf:
Die Klammern bewirken, dass eine Unterschale erzeugt wird. Diese Sub-Shell ändert dann ihr Arbeitsverzeichnis in
/c
und wird dannhelloworld
von ausgeführt/a
. Nach dem Beenden des Programms wird die Sub-Shell beendet und Sie kehren zu Ihrer Eingabeaufforderung der übergeordneten Shell in dem Verzeichnis zurück, in dem Sie begonnen haben.Fehlerbehandlung: Um zu vermeiden, dass das Programm ausgeführt wird, ohne das Verzeichnis geändert zu haben, z. B. wenn Sie falsch geschrieben haben
/c
, machen Sie die Ausführung vonhelloworld
Bedingungen abhängig:Reduzieren der Speichernutzung: Um zu vermeiden, dass die Subshell während der Ausführung von Hello World Speicher verschwendet, rufen Sie
helloworld
via exec auf:[Vielen Dank an Josh und Juliano für die Tipps zur Verbesserung dieser Antwort!]
quelle
Ähnlich wie die Antwort von David Schmitt und der Vorschlag von Josh, lässt jedoch keinen Shell-Prozess laufen:
Diese Methode ähnelt eher der Ausführung von Befehlen auf der Shell. Um den praktischen Unterschied zu erkennen, müssen Sie
ps ef
mit jeder Lösung von einer anderen Shell aus laufen .quelle
Eine Option, für die keine Subshell erforderlich ist und die zum Bash integriert ist
Demo:
quelle
pushd SOME_PATH && run_stuff && popd
: Wenn run_stuff fehlschlägt, wird popd nicht ausgeführt.set -e
in der Datei verwendet wird, und dies würde dann fehlschlagenpopd
.pushd "${SOME_PATH}" && run_stuff; popd
ist besser als die aktuelle Antwort, da die Pushd / Popd-Semantik speziell für diese Situation entwickelt wurde, in ein Verzeichnis zu wechseln und dann zum ursprünglichen zurückzukehren.quelle
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 ändern, um den Inhalt der Textdatei in stdout anstatt in eine bestimmte Datei zu schreiben. Auf diese Weise können Sie die Shell verwenden, um Ihre Datei überall zu schreiben.
$ cd ~ / b
$ ~ / a / helloworld> ~ / c / helloworld.txt
quelle
Ändern Sie einfach das letzte "&&" in ";" und es wird zurückgeschickt, egal ob der Befehl fehlschlägt oder erfolgreich ist:
quelle
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. Nach dem Beenden des Shell-Skripts wird das aktuelle Verzeichnis auf / b zurückgesetzt.
Hier ist ein Beispiel für ein Bash-Shell-Skript:
quelle
warum nicht einfach halten
cd SOME_PATH && run_some_command && cd -
Der letzte Befehl 'cd' bringt Sie zurück zum letzten pwd-Verzeichnis. Dies sollte auf allen * nix-Systemen funktionieren.
quelle
run_some_command
fehlschlägt,cd -
wird es nicht ausgeführt.Wenn Sie immer möchten, dass es zu / C geht, verwenden Sie beim Schreiben der Datei einen absoluten Pfad.
quelle
Wenn Sie dies in Ihrem Programm ausführen möchten, würde ich Folgendes tun:
quelle
Geben Sie aus dem aktuellen Verzeichnis den vollständigen Pfad zum Skriptverzeichnis an, um den Befehl auszuführen
quelle