Wenn ich das Arbeitsverzeichnis in einem Skript ändere und es ausführe, ändert sich das Arbeitsverzeichnis nur im Skript zum angegebenen Pfad.

Wenn ich das Arbeitsverzeichnis in einem Skript ändere und es ausführe, ändert sich das Arbeitsverzeichnis nur im Skript zum angegebenen Pfad.

Wenn ich in einem Skript das Arbeitsverzeichnis ändere und es ausführe, ändert sich das Arbeitsverzeichnis nur im Skript zum angegebenen Pfad. Hier ist mein Skript: (damit wollte ich sicherstellen, dass es tatsächlich das Verzeichnis geändert hat)
#!/bin/bash
cd /media/hard/drive/partitionX/
pwd

Wenn ich es ausführe, gibt es den angegebenen Pfad zurück, aber mein Arbeitsverzeichnis im Terminal ändert sich nicht. Wie ändere ich das Arbeitsverzeichnis in meinem Terminal über ein Skript?

Antwort1

Das ist normal. Das "aktuelle" oder "Arbeitsverzeichnis" ist ein Parameter pro Prozess, und ein Prozess kann nurseine eigeneArbeitsverzeichnis. Standalone-Skripte werden als separater Shell-Prozess ausgeführt und können die übergeordnete Shell nicht beeinflussen (tatsächlich ist die übergeordnete Shell möglicherweise nicht immerSeihöllisch).

Sie müssen interne Funktionen Ihrer Shell verwenden, beispielsweise:

  • Shell-Funktionen:

    mycd() {
        cd /media/hard/drive/partitionX/;
        pwd;
    }
    
  • Shell-Aliase:

    alias mycd='cd /media/hard/drive/partitionX; pwd'
    
  • Ein Skript als „Quelle“ verwenden, anstatt es auszuführen:

    . mycd.sh
    

Wenn Ihr Hauptziel darin besteht, Verknüpfungen zu bestimmten Verzeichnissen zu erstellen, können Sie auch Folgendes verwenden:

  • Symlinks an einem praktischeren Ort:

    ln -s /media/hard/drive/partitionX ~/partX
    cd ~/partX
    
  • Variablen ($mydir):

    mydir=/media/hard/drive
    cd $mydir
    
  • die $CDPATH-Funktion:

    CDPATH=".:/media/hard/drive"
    cd partitionX
    

Antwort2

Tatsächlich habe ich nach langem Suchen gerade herausgefunden, dass Sie Folgendes verwenden können, wenn Sie das Verzeichnis ändern und trotzdem dieselbe Shell behalten möchten, damit Sie alle Antworten in Ihrem aktuellen Skript erhalten:

(cd your_dir; do_some_command_there)

Ich musste beispielsweise Folgendes verwenden:

((cd your_dir; git remote -v | wc -l)

Klappt wunderbar!

verwandte Informationen