Zwei Skripte: Ein wechselndes Verzeichnis anderes nicht?

1

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?

Salil Surendran
quelle
1
Das erste ändert nicht das Verzeichnis der laufenden Shell für mich. Es druckt den Pfad zu ~ / code / mydirsomething, aber dann nach dem Verlassen Ich bin zurück in meinem ursprünglichen Verzeichnis links. Wie testest du es?
Gordon Davisson
Können Sie eine Demonstration Ihrer Ausführung dieser Skripte und der daraus resultierenden Änderung des Verzeichnisses bereitstellen?
Grawity
Hier ist eine Demo: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$
Salil Surendran
Bitte geben Sie keine Informationen in den Kommentaren an. Bearbeiten Sie Ihre Frage und geben Sie stattdessen die zusätzlichen Informationen ein. Kommentare sind schwer zu lesen, leicht zu übersehen und können ohne Vorwarnung gelöscht werden. Ihre Demo zeigt jedoch nicht, dass die übergeordnete Shell das Verzeichnis geändert hat. pwdDies ist die Ausgabe der Subshell, in der das Skript ausgeführt wird.
Terdon

Antworten:

0

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

#!/bin/bash
TEST="1234"
echo "$TEST"
bash 2.sh "$TEST"

Drehbuch 2

#!/bin/bash
TEST="$1"
echo "$TEST"
virus.cmd
quelle
0

Ihr erstes Skript ändert das Verzeichnis nicht. Ich weiß nicht, was Sie dazu bringt zu denken, dass es funktioniert, aber cdinnerhalb 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.shund starte es unter $HOME:

$ pwd
/home/terdon
$ foo.sh 1 
/home/terdon/code/mydir-1.6_
$ pwd
/home/terdon

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:

$ . ~/scripts/foo.sh
bash: [: =: unary operator expected
/home/terdon/code/mydir
$ pwd
/home/terdon/code/mydir

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:

changeDir(){
    targetDir="mydir"
    if [ "$1" = "1" ]; then
       targetDir="mydir-1.6_"
    fi
    \cd "$targetDir"
}

Fügen Sie das Obige zu Ihrem hinzu ~/.bashrcund 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 \cdanstelle von verwende cd. Dies ist für den Fall, dass Sie cd auf etwas ausgerichtet sind . Beachten Sie auch, dass ich Ihr Skript ein wenig geändert habe, um zu vermeiden, dass bash: [: =: unary operator expectedSie 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 $1versuchte das Skript , als es leer war, auszuführen:

$ if [ = 1 ]; then  targetDir="mydir-1.6_"; fi
bash: [: =: unary operator expected

Das gibt natürlich einen Fehler, da es nichts zu vergleichen gibt. Durch das Zitieren $1vergleichen Sie die leere Zeichenfolge und das funktioniert wie erwartet.

terdon
quelle