Wie kann Bash einen Befehl in einem anderen Verzeichniskontext ausführen?

93

Ich habe einen gemeinsamen Befehl, der aus ganz bestimmten Verzeichnissen heraus aufgerufen wird. Es gibt nur eine ausführbare Datei in / bin für dieses Programm, und das aktuelle Arbeitsverzeichnis ist sehr wichtig, um es korrekt auszuführen. Das Skript wirkt sich auf die Dateien aus, die sich in dem Verzeichnis befinden, in dem es ausgeführt wird.

Jetzt habe ich auch ein benutzerdefiniertes Shell-Skript, das einige Dinge in einem Verzeichnis ausführt, aber ich muss diesen oben erwähnten Befehl aufrufen, als wäre er in einem anderen Verzeichnis.

Wie macht man das in einem Shell-Skript?

Marty Wallace
quelle

Antworten:

37

Zu diesem Zweck können Sie das cdeingebaute oder das pushdund popdeingebaute verwenden. Beispielsweise:

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

Sie verwenden die integrierten Funktionen wie jeden anderen Befehl und können den Verzeichniskontext beliebig oft in einem Skript ändern.

Todd A. Jacobs
quelle
3
Es gibt auch cd -in einer POSIX-Shell, um zum vorherigen Verzeichnis zurückzukehren. Das heißt, (a) pushdund popdsind wirklich für den interaktiven Gebrauch gedacht, und (b) es ist nicht immer sicher anzunehmen, dass Sie dorthin zurückkehren können, cdwo Sie begonnen haben, insbesondere in komplexen Subsystemen, die intern möglicherweise restriktive Berechtigungen verwenden (siehe stackoverflow.com/questions/). 10555284 /… ).
Geekosaurier
3
Die Verwendung einer Unterschale ist eine viel bessere Lösung
josh123a123
Für die Skripterstellung ist eine Subshell wahrscheinlich eine bessere Idee. Ich freue mich jedoch sehr, etwas darüber zu lernen popd.
Connorbode
Können Sie bitte erklären, was :Symbol hier bedeutet?
Vadim Kotov
2
@VadimKotov Ich denke, es ist effektiv ein No-Op. Relevanter Abschnitt der man bashLesungen: : [arguments]Keine Wirkung; Der Befehl erweitert lediglich die Argumente und führt die angegebenen Umleitungen aus. Der Rückgabestatus ist Null.
Boycy
213

Verwendung cdin einer Unterschale; Die Kurzform für die Verwendung dieser Art von Unterschale sind Klammern.

(cd wherever; mycommand ...)

Wenn Ihr Befehl jedoch über eine Umgebung verfügt, die er benötigt, sollte er diese Umgebung selbst sicherstellen, anstatt alles zu belasten, was ihn verwenden möchte (es sei denn, es handelt sich um einen internen Befehl, der unter ganz bestimmten Umständen im Kontext eines Bohrlochs verwendet wird definiert ein größeres System, so dass jeder Anrufer bereits die Umgebung sicherstellen muss, die er benötigt). Normalerweise ist dies eine Art Shell-Skript-Wrapper.

Geekosaurier
quelle
Sie können auch ein \nacheinander ;für mehrzeilige Befehle im selben Kontext einfügen .
Chiramisu
34
(cd /path/to/your/special/place;/bin/your-special-command ARGS)
bmargulies
quelle
20

Wenn Sie zu Ihrem aktuellen Arbeitsverzeichnis zurückkehren möchten:

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. Wir setzen eine Variable current_dirgleich Ihrerpwd
  2. Danach gehen wir dorthin, cdwo Sie Ihren Befehl ausführen müssen
  3. dann führen wir den Befehl aus
  4. dann kehren wir cdzu unserer Variablen zurückcurrent_dir

Eine andere Lösung von @apieceofbart pushd && YOUR COMMAND && popd

abc123
quelle
3
oder Sie könnten tunpushd && YOUR COMMAND && pulld
pro Stück Bart
3
@apieceofbart Ich denke du meintest popdstatt pulld.
Konstantin