mv: nicht gefunden, wenn es von einem Skript ausgeführt wird, das die PATH-Variable ändert

mv: nicht gefunden, wenn es von einem Skript ausgeführt wird, das die PATH-Variable ändert

Ich habe dies in meinem Skript. Aber es gibt einen Fehler zurück. Wenn ich den Befehl in der Konsole ausführe, funktioniert er einwandfrei

./script.sh[16]: mv: not found [No such file or directory]

Ich möchte einige Dateien, die mit T353 beginnen, von einem Ordner in einen anderen verschieben.REMOTE_PATHist /tmp/ undWEGist mein Arbeitsverzeichnis

cd $REMOTE_PATH
mv T353* $PATH #this is the line 16

Wenn ja, make mv /tmp/T353* .funktioniert es einwandfrei.

Antwort1

Sie scheinen die Variable in Ihrem Skript zu verwenden PATH. Dies ist zufällig die Variable, die die Shell zum Nachschlagen von ausführbaren Dateien verwendet. Das bedeutet, dass die Shell :Dinge wie oder andere Standard-Dienstprogramme möglicherweise nicht mehr findet, wenn Sie sie in etwas anderes ändern, das keine durch - begrenzte Liste von Pfaden ist, oder in einen Pfad, der nicht die vom Skript verwendeten ausführbaren Dateien enthält mv.

Aus diesem Grund ist es vorzuziehen, in Shell-Skriptvariablen Kleinbuchstaben zu verwenden (es ist Geschmackssache 1 ) oder sich zumindest darüber im Klaren zu sein, dass es Variablen gibt, die von der Shell für verschiedene Dinge verwendet werden, und dass Sie es vermeiden sollten, diese zu ändern, es sei denn, Sie möchten natürlich das Verhalten der Shell ändern.

Die von Bash verwendeten Variablen sind im Bash-Handbuch unter der Überschrift „Shell-Variablen“ aufgeführt.

Übrigens, die cdin der Zeile obentutfunktioniert. Das liegt daran, dass es sich um ein spezielles Dienstprogramm handelt, das in die Shell selbst integriert ist. Die Shell muss daher nicht nachsehen, $PATHum herauszufinden, wo sie sich befindet.

Sie sagen übrigens auch, dass dies $PATHIhr Arbeitsverzeichnis ist. Die Shell speichert das aktuelle Arbeitsverzeichnis bereits in $PWD.

Als Randbemerkung: Machen Sie es sich zur Gewohnheit, Ihre Variablen in doppelte Anführungszeichen zu setzen. Siehe "Sicherheitsimplikationen, wenn vergessen wird, eine Variable in Bash/POSIX-Shells in Anführungszeichen zu setzen".


1 Naja, größtenteils, aber der POSIX-Standardreserviert den Namespace von Großbuchstabenvariablen fürUmgebungsvariablen(d. h. exportierte Shell-Variablen), die von der Shell und der Sammlung von Standard-Dienstprogrammen verwendet werden. Soweit ich weiß, ist das nicht der Fall.nicht zulassendie Verwendung von Großbuchstaben innicht exportierte Shell-Variablen, aber der ganze Zweck der Definition von Namespaces besteht darin, Konflikte zu vermeiden. Da Umgebungsvariablen und Shellvariablen für ein Skript dieselbe Semantik haben, ist es besser, Variablen in Großbuchstaben einfach ganz zu vermeiden.

verwandte Informationen