Ich habe zwei Skripte. Eins ist:
#!/bin/bash
if [ $1 = 1 ]; then
dir=mydir-1.6_
else
dir=mydir
fi
cd ~/code/${dir}$2
echo $(pwd)
Das obige Skript ändert Verzeichnisse, obwohl es mehrere Posts gibt, die besagen, dass ein Skript, das in einer Sub-Shell ausgeführt wird, keine Auswirkungen auf die ausführende Shell haben sollte.
Jetzt habe ich ein anderes Skript:
#!/bin/bash
dir=/WORK/temp/$1
mkdir -p $dir
cd $dir
wget http://somurl.com/archive.zip
unzip archive.zip
Das obige Skript entpackt die Datei im erwarteten Verzeichnis, belässt die aufrufende Shell jedoch im selben Verzeichnis. Was ist der Unterschied, wenn in beiden Skripten cd aufgerufen wird?
salilsurendran@salilsurendran-ThinkPad-P50:~$ myscript 1 4 /home/salilsurendran/code/mydir-1.6_4 salilsurendran@salilsurendran-ThinkPad-P50:~/code/mydir-1.6_4$ pwd /home/salilsurendran/code/mydir-1.6_4 salilsurendran@salilsurendran-ThinkPad-P50:~/code/mydir$ myscript 2 3 /home/salilsurendran/code/mydir3 salilsurendran@salilsurendran-ThinkPad-P50:~/code/mydir3$ pwd /home/salilsurendran/code/mydir3 salilsurendran@salilsurendran-ThinkPad-P50:~/code/mydir3$
pwd
Dies ist die Ausgabe der Subshell, in der das Skript ausgeführt wird.Antworten:
Wenn ich verstehe, was Ihr Problem ist, können Sie versuchen, das zweite Skript vom ersten auszuführen, indem Sie das erwartete Verzeichnis übergeben. So was.
Drehbuch 1
Drehbuch 2
quelle
Ihr erstes Skript ändert das Verzeichnis nicht. Ich weiß nicht, was Sie dazu bringt zu denken, dass es funktioniert, aber
cd
innerhalb eines ausgeführten Skripts wird es niemals die übergeordnete Shell beeinflussen. So funktioniert es einfach.Die einzige Möglichkeit, das Verzeichnis der übergeordneten Shell zu ändern, besteht darin, sie als Quelle anzugeben, anstatt sie auszuführen. Ich habe dein erstes Skript als gespeichert
foo.sh
und starte es unter$HOME
:Wie Sie sehen, wird das Verzeichnis innerhalb des Skripts geändert, die PWD der übergeordneten Shell bleibt jedoch unverändert. Wenn Sie es jetzt als Quelle angeben, funktioniert es wie erwartet:
Wenn Sie möchten, dass Ihr Skript das Verzeichnis der übergeordneten Shell ändert, müssen Sie es als Quelle angeben und nicht ausführen. Wenn Sie dies jedoch versuchen, möchten Sie eine Funktion schreiben, kein Skript:
Fügen Sie das Obige zu Ihrem hinzu
~/.bashrc
und verwenden Sie das anstelle eines Skripts. Funktionen wirken sich immer auf die Shell aus, in der sie ausgeführt werden, und ändern Ihr Verzeichnis so, wie Sie es möchten.Beachten Sie, dass ich
\cd
anstelle von verwendecd
. Dies ist für den Fall, dass Siecd
auf etwas ausgerichtet sind . Beachten Sie auch, dass ich Ihr Skript ein wenig geändert habe, um zu vermeiden, dassbash: [: =: unary operator expected
Sie mit Ihrer ursprünglichen Herangehensweise konfrontiert wurden. In Shell-Skripten ist es wichtig , dass Sie Ihre Variablen immer in Anführungszeichen setzen. In diesem Fall$1
versuchte das Skript , als es leer war, auszuführen:Das gibt natürlich einen Fehler, da es nichts zu vergleichen gibt. Durch das Zitieren
$1
vergleichen Sie die leere Zeichenfolge und das funktioniert wie erwartet.quelle