Wie führe ich ein Programm mit einem anderen Arbeitsverzeichnis von aktuellen, von Linux-Shell?
-
16-09-2019 - |
Frage
Mit einem Linux-Shell, wie starte ich ein Programm mit einem anderen Arbeitsverzeichnis aus dem aktuellen Arbeitsverzeichnis?
Zum Beispiel, ich habe eine Binärdatei helloworld
, den die Datei hello-world.txt
im aktuellen Verzeichnis erstellt. Diese Datei befindet sich innerhalb des Verzeichnisses /a
. Derzeit bin ich im Verzeichnis /b
. Ich möchte mein Programm läuft ../a/helloworld
starten und die hello-world.txt
irgendwo in einem dritten Verzeichnis /c
erhalten.
Lösung
Rufen Sie das Programm wie folgt aus:
(cd /c; /a/helloworld)
Die Klammern verursachen eine Unterschale hervorgebracht werden. Diese Unterschale dann ändert sich sein Arbeitsverzeichnis /c
, führt helloworld
aus /a
. Nachdem das Programm beendet, beendet die Unterschale, die Sie Ihre prompte der Eltern-Shell zurückkehrt, in dem Verzeichnis, das Sie aus gestartet.
Fehlerbehandlung: zu vermeiden, um das Programm ausgeführt wird, ohne das Verzeichnis geändert hat, zum Beispiel wenn falsch geschrieben /c
hat, macht die Ausführung von helloworld
bedingten:
(cd /c && /a/helloworld)
Die Verringerung der Speichernutzung: zu vermeiden Um die Subshell Abfallspeicher, während hallo Welt ausführt, helloworld
über exec aufrufen:
(cd /c && exec /a/helloworld)
[Dank Josh und Juliano für Tipps zur Verbesserung dieser Antwort zu geben!]
Andere Tipps
Wie David Schmitt 's Antwort, und Joshs Vorschlag, aber keine Shell-Prozess laufen lassen:
(cd /c && exec /a/helloworld)
Auf diese Weise ist ähnlich, wie Sie in der Regel Befehle auf der Shell ausgeführt. Um den praktischen Unterschied zu sehen, haben Sie ps ef
von einer anderen Shell mit jeder Lösung ausgeführt werden.
Eine Option, die keine Sub-Shell benötigt und ist in bash gebaut
(pushd SOME_PATH && run_stuff; popd)
Demo:
$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
sh -c 'cd /c && ../a/helloworld'
Ich denke immer UNIX-Tools sollten als Filter geschrieben werden, eine Eingabe von stdin lesen und Ausgabe auf stdout schreiben. Wenn möglich, dass Sie Ihre Hello World binär ändern könnten den Inhalt der Textdatei zu schreiben, anstatt eine bestimmte Datei nach stdout. Auf diese Weise können die Shell verwenden können Sie Ihre Datei an beliebiger Stelle zu schreiben.
$ Cd ~ / b
$ ~ / A / helloworld> ~ / c / helloworld.txt
Ändern Sie einfach die letzte „&&“ in „;“ und es wird cd zurück, egal, ob der Befehl fehlschlägt oder erfolgreich ist:
cd SOME_PATH && run_some_command ; cd -
Eine Möglichkeit, das zu tun, ist ein Wrapper-Shell-Skript zu erstellen.
Der Shell-Skript würde das aktuelle Verzeichnis / c ändern, dann / a / helloworld. Sobald der Shell-Skript beendet, kehrt das aktuelle Verzeichnis zurück zu / b.
Hier ist ein Bash-Shell-Skript-Beispiel:
#!/bin/bash
cd /c
/a/helloworld
, warum es nicht einfach halten
cd SOME_PATH && run_some_command && cd -
Der letzte Befehl ‚cd‘ bringt Sie zurück zur letzten PWD Verzeichnis nehmen. Dies sollte auf alle arbeiten * nix-Systemen.
Wenn Sie immer es / C gehen wollen, einen absoluten Pfad verwenden, wenn Sie die Datei schreiben.
Wenn Sie dies in Ihrem Programm ausführen wollen, dann würde ich so etwas wie:
#include <unistd.h>
int main()
{
if(chdir("/c") < 0 )
{
printf("Failed\n");
return -1 ;
}
// rest of your program...
}
aus dem aktuellen Verzeichnis geben Sie den vollständigen Pfad zum Skript-Verzeichnis des Befehl auszuführen
/root/server/user/home/bin/script.sh