Kann mir bitte jemand erklären, warum meine While-Schleife einen internen Gültigkeitsbereich zu haben scheint? Ich habe online mehrere Erklärungen gesehen, aber sie haben alle mit Pipes zu tun. Mein Code hat keine.
Der Code:
#!/bin/sh
while read line
do
echo "File contents: $line"
echo
if [ 1=1 ]; then
test1=bob
fi
echo "While scope:"
echo " test1: $test1"
done < test.txt
if [ 1=1 ]; then
test2=test2;
fi
echo;
echo "Script scope: "
echo " test1: $test1"
echo " test2: $test2"
Die Ausgabe:
File contents: In the file
While scope:
test1: bob
Script scope:
test1:
test2: test2
Antwort1
In der Bourne-Shell führt die Umleitung eines zusammengesetzten Befehls (wie Ihrer while
Schleife) dazu, dass dieser zusammengesetzte Befehl in einer Untershell ausgeführt wird.
In Solaris 10 und früheren Versionen 1 sollten Sie nicht verwenden, /bin/sh
da es sich dabei um die Bourne-Shell handelt. Verwenden Sie stattdessen /usr/xpg4/bin/sh
oder /usr/bin/ksh
, um ein POSIX zu erhalten sh
.
Wenn Sie aus irgendeinem Grund verwenden müssen /bin/sh
, können Sie das Problem umgehen, indem Sie Folgendes tun:
compound-command < file
Du kannst tun:
exec 3<&0 < file
compound-command
exec <&3 3<&-
Das ist:
- Duplizieren Sie FD 0 auf FD 3, um es zu speichern, und leiten Sie FD 0 dann in die Datei um.
- Führen Sie den Befehl aus
- Stellen Sie FD 0 aus der gespeicherten Kopie auf FD 3 wieder her. Und schließen Sie FD 3, da es nicht mehr benötigt wird.
1. In Solaris 11 und höher hat Oracle schließlich (endlich) /bin/sh
eine POSIX-Shell erstellt, die sich nun wie die sh
der meisten anderen Unix-Systeme verhält (sie interpretiert die sh
von POSIX angegebene Sprache, unterstützt jedoch Erweiterungen, da sie auf ksh88
(wie andere Unix-Systeme, die sh
nun im Allgemeinen auf ksh88, pdksh, bash, yash oder einer erweiterten ash-Version basieren) basiert).