Fehlermeldung 'Quelle: nicht gefunden' beim Ausführen eines Skripts

34

Ich erstelle ein kleines automatisiertes Setup-Skript, das geändert wird /etc/profileund $HOME/.profilebei dem einige Pfade nicht exportiert werden. Dann möchte ich diese automatisch neu laden.

Ich habe gelesen, dass dies der sourceFall ist, also habe ich mein Terminal hochgefahren und Folgendes eingegeben:

source /etc/profile
source ~/.profile

Vom Terminal wurde kein Fehler ausgegeben.

Das Einfügen dieser beiden Befehle in das Bash-Skript führt jedoch zu source: not found.

  1. Wie kann ich sicher sein, dass das Skript von Bash ausgeführt wird, auch wenn dies #!/bin/shangegeben ist (anscheinend wird dies nicht garantiert)?
  2. Warum sollte es heißen, dass diese beiden Quellen nicht gefunden werden können, wenn sie unverkennbar sind?
Yanick Rochon
quelle

Antworten:

53

/bin/shist nicht bash. Um Ihr Skript mit auszuführen bash, schreiben Sie #!/bin/bashals erste Zeile in Ihr Skript.

Der Fehler source: not foundwird nicht gelöscht, da er /etc/profilenicht gefunden wird. Es wird fallen gelassen, weil sourcees nicht gefunden wird. sourceist eine in Bash integrierte Funktion, mit der Sie das Skript nicht ausführen bash. Es ist also klar, warum es nicht gefunden wird. Ändern Sie die #!Zeile im Skript, und es wird funktionieren.

Chaos
quelle
9

1. Wie kann ich sicher sein, dass das Skript von Bash ausgeführt wird, auch wenn dies #!/bin/shangegeben ist (anscheinend wird dies nicht garantiert)?

Um sicherzugehen, dass ein für die shShell geschriebenes Skript (wie in Ihrem Fall - siehe Was ist der Unterschied zwischen #! / Bin / sh und #! / Bin / bash? ) Von Bash ausgeführt wird, führen Sie einfach den folgenden Befehl aus:

bash script_name

Somit wird dieser Fehler nicht mehr angezeigt.

2. Warum sollte es heißen, dass diese beiden Quellen nicht gefunden werden können, wenn sie unverkennbar sind?

Es heißt nicht, dass diese Dateien nicht vorhanden sind. Es heißt, dass der sourceBefehl nicht gefunden wird. Dies ist normal, da Sie Ihr Skript mit #!/bin/shline starten shund nicht bashwie Sie vielleicht denken, mit und ausführen . Warum ist es normal? Weil der sourceBefehl ein eingebauter Bash ist, aber kein sheingebauter. Um eine Datei als Quelle zu verwenden sh, sollten Sie .(Punkt) verwenden. Beispiel:

. /etc/profile
. ~/.profile

Eine andere Möglichkeit besteht darin, die Shebang-Linie so zu ändern, #!/bin/bashwie es das Chaos in seiner Antwort ausdrückte .

Radu Rădeanu
quelle
4

Siehe diese SO-Frage :

/bin/shist normalerweise eine andere Shell, die versucht, die Shell nachzuahmen. Viele Distributionen verwenden /bin/bashdafür sh, es unterstützt Source. Unter Ubuntu /bin/dashwird jedoch verwendet, das Source nicht unterstützt. Wenn Sie das Skript nicht bearbeiten können, versuchen Sie, die Shell zu ändern, auf der es ausgeführt wird.

muru
quelle
1

Einige Muscheln unterstützen .statt source. Also kannst du so etwas probieren

. filename

anstatt

source filename

Hoffe, es funktioniert

Shivam Agrawal
quelle