Wie führe ich ein Programm mit einem anderen Arbeitsverzeichnis von aktuellen, von Linux-Shell?

StackOverflow https://stackoverflow.com/questions/786376

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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top