
Ich habe eine Test-KSH-Datei auf CD in einen Ordner geschrieben und ein Listing erstellt. Folgendes steht darin:
`cd "their_file/"`;
`pwd`;
`ls -l`;
Gibt mir folgende Ausgabe:
./test.ksh: line 2: /home/user/final: Is a directory
./test.ksh: line 3: total: command not found
Dies ist mein Passwort:
/home/Benutzer/final
Wie behebe ich das? Ich vermute, es führt die CD-Anweisung aus und beendet dann die Anweisung. Ich verwende eine Fedora-Maschine.
Antwort1
Die Backticks um jeden Befehl in Ihrem Skript veranlassen die Shell, die Ausgabe des Befehls zu übernehmen und auszuführenDasals Befehl.
Die Verwendung von Backticks um einen Befehl ist gleichbedeutend damit, den Befehl darin einzufügen $( ... )
(dies ist die bevorzugte Syntax zum Erfassen der Ausgabe eines Befehls).
Die Fehlermeldung /home/user/final: Is a directory
wird beim ksh
Versuch angezeigt, das Ergebnis von als Befehl auszuführen pwd
, bzw. total: command not found
beim Versuch, das Ergebnis von auszuführen ls -l
.
Entfernen Sie die Backticks. Entfernen Sie auch die Semikolons ( ;
). Diese sind nur erforderlich, wenn Sie zwei Befehle in dieselbe Zeile setzen möchten:
cd dir; pwd
Ihr Skript sollte ungefähr so aussehen
#!/bin/sh
cd "their_file"
pwd
ls -l
Beachten Sie, dass dies auch dann noch ausgeführt wird pwd
, ls -l
wenn es cd
fehlschlägt. So beenden Sie das Skript, wenn cd
es fehlschlägt:
#!/bin/sh
cd "their_file" || exit 1
pwd
ls -l
Dies nutzt die Tatsache, dass cd
ein Wert ungleich Null zurückgegeben wirdBeendigungsstatuswenn es fehlschlägt. Die ||
(logischeoder) vor bedeutet, dass das Skript mit der Ausführung der Anweisung exit 1
fortfährt, wenn es „false“ zurückgibt (was in Shell-Skripten ein Exit-Status ungleich Null bedeutet).exit
cd
Der Grund, warum Sie bekommen /home/user/final: Is a directory
undnicht /home/user/final/their_file: Is a directory
liegt daran, dass die cd
in einemUnterschale(das passiert, wenn Sie es in Backticks oder innerhalb von einfügen $( ... )
.) Da es in einer untergeordneten Shell ausgeführt wird, wird die tatsächliche Änderung des Arbeitsverzeichnisses nicht in der übergeordneten Shell (Ihrem Skript) widergespiegelt.
Aus demselben Grund werden Sie feststellen, dass Sie sich nach der Ausführung Ihres Skripts noch immer im selben Verzeichnis befinden wie beim Aufrufen des Skripts und nicht im Verzeichnis their_file
.
Weitere Informationen zu diesem Thema finden Sie unter „warum die CD-Funktion im Skript nicht funktioniert" Und "Skript zum Ändern des aktuellen Verzeichnisses (cd, pwd)" (und andere ähnliche Fragen).