Quellbefehl in sh-Shell nicht gefunden

145

Ich habe ein Skript, das shShell verwendet. Ich erhalte eine Fehlermeldung in der Zeile, in der der sourceBefehl verwendet wird. Es scheint sourcenicht in meiner shShell enthalten zu sein.

Wenn ich explizit versuche, sourcevon der Shell zu laufen, bekomme ich:

sh: 1: source: not found

Sollte ich irgendwie "source" installieren? Habe ich eine falsche Version von sh?

Milad
quelle
1
Man könnte vernünftigerweise argumentieren, dass eine Shell, die unterstützt, sourceeine "falsche Version" ist.
William Pursell
1
Die Fehlermeldung source: not foundbedeutet auch, dass der sourceBefehl ordnungsgemäß ausgewertet wurde, die gelesene Datei jedoch nicht vorhanden ist.
Simon Richter
4
Eine "Installation" ist nicht möglich, source da dies eine Funktion der Shell ist. Es kann nicht als externer Befehl implementiert werden.
Christopher Schultz

Antworten:

149

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

Choroba
quelle
2
Vielen Dank! Das Ersetzen von / bin / sh durch / bin / bash hat unter Ubuntu funktioniert! Ich bin gespannt warum, heißt das auf Ubuntu Bash ist sh?
Milad
1
@Milad: Bei jüngsten Ubuntus- /bin/shAnrufen /bin/dash. Traditionell /bin/shgenannt /bin/bashist Modus sh-Kompatibilität.
Choroba
@ Milad Ich denke, es funktioniert nicht auf Ubuntu 14.04. Was ist Ihre Betriebssystemversion?
Reza Ameri
1
Vielleicht helfen Sie bekannt - wenn Sie Kaskadenskripte haben, benennen Sie alle "sh -> bash" um. Danke dir. :-)
BG Bruno
Es war mir leider nicht sofort intuitiv, dieses Problem zu beheben, aber es hat mich auf den richtigen Weg gebracht. Ich musste SHELL := /bin/bashoben in meinem Makefile hinzufügen .
anon58192932
136

Verwenden Sie in der Bourne-Shell (sh) die. Befehl zum Quellen einer Datei

. filename
Guru
quelle
Ich darf das Skript nicht wirklich ändern, es läuft gut auf einem Redhat-Server. Aber auf diesem Server scheint die Quelle in sh
Milad
2
Wenn ja, ist sourcees nicht streng sh.
Tripleee
4
Ich hatte diese Art von Problem bei Jenkins (beim Versuch, eine als "geheime Datei" gespeicherte Datei zu beschaffen) und bei der Beschaffung durch "." Befehl war die Lösung.
Jan Vlcinsky
Dies sollte die beste Antwort sein, da es mit sh, dash und bash funktioniert.
Akhan
3
Aus Gründen der Kompatibilität mit Mac OS (Entwicklungsumgebung) und Travis-CI (Testumgebung) musste ich verwenden . ./filename. Andernfalls würde sh: 1: .: filename: not foundbeim Ausführen von Tests auf Travis-CI eine Fehlermeldung angezeigt.
Adrien Joly
48
$ls -l `which sh`
/bin/sh -> dash

$sudo dpkg-reconfigure dash #Select "no" when you're asked
[...]

$ls -l `which sh`
/bin/sh -> bash

Dann wird es OK sein

shlsy
quelle
Nett! Ich verwende RHEL- und Ubuntu-Server und habe immer kleine Probleme wie dieses mit Ubuntu. Ich mag RHEL wirklich und RHEL mag Linux.
Radtek
Die akzeptierte Antwort funktioniert unter Ubuntu 14 nicht, diese funktioniert!
Rohithpr
Bitte fügen Sie Ihrer Antwort eine weitere Erklärung hinzu - was macht es? dpkg-reconfigureist möglicherweise nicht für alle Benutzer zugänglich, insbesondere auf Systemen, die nicht auf Debian
Nico Haase
Meine source: not foundFehler mit alten Telnet-Clients nach dem Debian-Upgrade wurden behoben, danke.
bjoster
30

Das sourceEingebaute ist ein Bashismus. Schreiben Sie dies einfach als .stattdessen.

z.B

. $FILE

# OR you may need to use a relative path (such as in an `npm` script):

. ./$FILE

https://wiki.ubuntu.com/DashAsBinSh#source

Travis Clarke
quelle
9

Dieses Problem tritt auf, weil Jenkins Execute Shell das Skript über / bin / sh ausführt

Folglich kennt / bin / sh "Quelle" nicht.

Sie müssen nur die folgende Zeile oben in Ihrer Execute Shell in Jenkins hinzufügen

#!/bin/bash
Mojtaba Yousefi
quelle
Die gestellte Frage hat doch nichts mit Jenkins
Nico Haase
8

Der sourceBefehl ist in einige Shells integriert. Wenn Sie ein Skript haben, sollte es angeben, welche Shell in der ersten Zeile verwendet werden soll, z.

#!/bin/bash
mah
quelle
Nun, es heißt #! / Bin / sh und unter einem anderen Linux, wenn ich sh manuell eingebe und frage "welche Quelle" es mir sagt: Quelle: Shell eingebauter Befehl
Milad
Oh, dafür war diese Linie da. Ich habe mich immer gewundert. vielen Dank!
CommonSenseCode
5

Ich konfrontiert diesen Fehler , während ich auf Anruf versuchte Quelle Befehl von #Jenkins Shell auszuführen.

source profile.txt oder source profile.properties

Ersatz für Quellbefehl ist zu verwenden,

. ./profile.txt oder . ./profile.properties

Hinweis: Zwischen den beiden Punkten (.) Ist ein Leerzeichen.

GangaRam Dewasi
quelle
0

Ich habe in einem Gnu-Makefile unter Ubuntu gefunden (wo / bin / sh -> bash)

Ich musste das benutzen. Befehl und geben Sie das Zielskript mit dem Präfix ./ an (siehe Beispiel unten).

Quelle hat in dieser Instanz nicht funktioniert, nicht sicher warum, da es / bin / bash aufrufen sollte.

Meine SHELL-Umgebungsvariable ist ebenfalls auf / bin / bash gesetzt

test:
    $(shell . ./my_script)

Beachten Sie, dass dieses Beispiel das Tabulatorzeichen nicht enthält. musste für den Stapelaustausch formatieren.

Gord Warte
quelle
0

source ist ein in bash integrierter Befehl. Um den Quellbefehl auszuführen, können Sie sich als Root anmelden.

sudo -s source ./filename.sh

Swati Jain
quelle
Dies scheint keine gültige Lösung zu sein. Was ist, wenn der Benutzer keine Sudo-Berechtigungen hat? Und das bezogene Zeug ist danach nur noch als Administrator verfügbar, was neue Probleme verursachen wird
Nico Haase
0

Unter Ubuntu habe ich anstelle von sh scriptname.sh zum Ausführen der Datei verwendet. scriptname.sh und es hat funktioniert! Die erste Zeile meiner Datei enthält: #!/bin/bash

Verwenden Sie diesen Befehl, um das Skript auszuführen

.name_of_script.sh
DInfo2019
quelle
1
Dies wurde bereits mehrfach beantwortet. Bitte geben Sie weitere Informationen an, wenn Sie in einem solchen Fall eine neue Antwort hinzufügen
Nico Haase,
-3

Dies kann Ihnen helfen. Ich habe diesen Fehler erhalten, weil ich versucht habe, meinen .profilemit dem Befehl neu zu laden, . .profileund es einen Syntaxfehler gab

Kolob Canyon
quelle
-6

Bourne Shell (sh) verwendet PATH, um in zu lokalisieren source <file>. Wenn sich die Datei, die Sie beschaffen möchten, nicht in Ihrem Pfad befindet, wird der Fehler "Datei nicht gefunden" angezeigt.

Versuchen:

source ./<filename>
mosu
quelle
5
Der Beitrag sagt sh: 1: source: not foundnichtfile not found
Cristian Chaparro A.