2015-09-25 5 views
6

Mein einfaches Skript ist wie folgt:". Dateiname" kann Datei nicht finden, wenn von/bin/sh ausgeführt wird, funktioniert von/bin/bash; Warum?

#!/bin/sh 


DEF=.file_name_with_a_leading_dot.sh 

. ${DEF} 

Mitteilung über das/bin/sh auf der obersten Zeile. Wenn ich dieses einfache Skript ausführen, bekomme ich einen Fehler, dass die Datei nicht gefunden wird. Aber wenn ich diese obere Zeile zu #!/Bin/bash ändere, dann findet das Skript diese Datei im aktuellen Verzeichnis gut.

Aber, auf meinem Ubuntu Linux-Laptop sehe ich, dass/bin/sh ist ein Symlink zu/bin/bash. Also, warum verhält sich mein Skript anders?

Außerdem kann ich das Skript wie folgt ausführen:

/bin/bash ./script.sh 

Und es ist OK.

Also, was fehlt mir?

+0

Sie können einen Blick hier werfen: http://stackoverflow.com/questions/5725296/difference-between-sh-and-bash. Grundsätzlich sind 'bash' und' sh' nicht dasselbe. – ThanksForAllTheFish

+2

Bash startet im Kompatibilitätsmodus, wenn er '/ bin/sh' genannt wird. – hek2mgl

+0

Aber warum heißt das, dass er die Datei nicht findet? Ich kann das reproduzieren. – tripleee

Antwort

6

Vom Manpage:

. Dateiname [Argumente]

Quelldateiname [Argumente] lesen und Befehle von Dateinamen in der aktuellen Shell-Umgebung auszuführen, und gibt den Beendigungsstatus des letzten Befehls von Dateinamen ausgeführt. Wenn der Dateiname keinen Schrägstrich enthält, werden Dateinamen in PATH verwendet, um das Verzeichnis zu finden, das den Dateinamen enthält. Die in PATH gesuchte Datei muss nicht ausführbar sein. Wenn bash nicht im posix-Modus ist, wird das aktuelle Verzeichnis durchsucht, wenn keine Datei in PATH gefunden wird. Wenn die Option "sourcepath" auf der Befehl shopt inch deaktiviert ist, wird PATH nicht durchsucht. Wenn Argumente übergeben werden, werden sie zu den Positionsparametern, wenn der Dateiname ausgeführt wird. Ansonsten sind die Positionsparameter unverändert. Der Rückgabestatus ist der Status des letzten Befehls innerhalb des Skripts (0, wenn keine Befehle ausgeführt werden) und false, wenn Dateiname nicht gefunden oder nicht gelesen werden kann.

So scheint es, dass der Shebang #!/bin/sh Ihre Bash auf Posix-Modus setzt. In diesem Modus wird nur PATH ausgewertet, nicht das aktuelle Verzeichnis.

+3

Was bedeutet: Verwenden Sie '. ./"$ DEF "', damit es im POSIX-Modus funktioniert. – chepner

Verwandte Themen