Nie znaleziono polecenia źródła w powłoce sh

146

Mam skrypt, który używa shpowłoki. W wierszu używającym sourcepolecenia pojawia się błąd. Wydaje się, że sourcenie jest uwzględniony w mojej shpowłoce.

Jeśli jawnie spróbuję uruchomić sourcez powłoki, otrzymuję:

sh: 1: source: not found

Czy powinienem jakoś zainstalować „source”? Czy mam złą wersję sh?

Milad
źródło
1
Można rozsądnie argumentować, że powłoka, która obsługuje, sourcejest „złą wersją”.
William Pursell
1
Ponadto komunikat o błędzie source: not foundoznacza, że sourcepolecenie zostało poprawnie ocenione, ale plik, który powinien był odczytać, nie istnieje.
Simon Richter,
4
Nie można „zainstalować”, source ponieważ jest to funkcja powłoki. Nie można go zaimplementować jako polecenie zewnętrzne.
Christopher Schultz,

Odpowiedzi:

151

/bin/shto zazwyczaj inna powłoka próbująca naśladować powłokę. Wiele dystrybucji używa /bin/bashdla sh, obsługuje source. Jednak na Ubuntu /bin/dashjest używany, który nie obsługuje source. Większość pocisków używa .zamiast source. Jeśli nie możesz edytować skryptu, spróbuj zmienić powłokę, która go uruchamia.

choroba
źródło
2
Dzięki! Zastąpienie / bin / sh przez / bin / bash działało na Ubuntu! Jestem jednak ciekawy, dlaczego to znaczy, że na Ubuntu bash jest sh?
Milad
1
@Milad: W ostatnich Ubuntus, /bin/shzaproszeń /bin/dash. Tradycyjnie /bin/shwywoływany /bin/bashjest tryb zgodności z sh.
choroba
@Milad Myślę, że to nie działa na Ubuntu 14.04. Jaka jest twoja wersja systemu operacyjnego?
Reza Ameri
1
Może pomóc wiedzieć - jeśli masz skrypty kaskadowe, zmień nazwę wszystkich "sh -> bash". Dziękuję Ci. :-)
BG Bruno
Niestety, nie było dla mnie od razu intuicyjne, jak rozwiązać ten problem, ale postawił mnie na właściwej drodze. Musiałem dodać SHELL := /bin/bashna początku mojego pliku Makefile.
anon58192932
136

W powłoce Bourne'a (sh) użyj rozszerzenia. polecenie, aby pobrać plik

. filename
Guru
źródło
Naprawdę nie mogę zmieniać skryptu, działa dobrze na serwerze redhat. Ale na tym serwerze źródło wydaje się być zawarte w sh
Milad
2
Jeśli tak source, to nie jest ściśle sh.
tripleee
4
Miałem tego typu problem z Jenkinsem (próbowałem pozyskać plik zapisany jako „tajny plik”) i pozyskiwać przez „”. polecenie było rozwiązaniem.
Jan Vlcinsky
To powinna być najlepsza odpowiedź, ponieważ będzie działać z sh, dash i bash.
akhan
3
Ze względu na kompatybilność z Mac OS (środowisko deweloperskie) i Travis-CI (środowisko testowe) musiałem użyć . ./filename. W przeciwnym razie wystąpiłbym sh: 1: .: filename: not foundbłąd podczas uruchamiania testów na Travis-CI.
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

Wtedy będzie dobrze

shlsy
źródło
Miły! Używam serwerów RHEL i Ubuntu i zawsze mam małe problemy, takie jak ten z Ubuntu. Bardzo lubię RHEL i RHEL jak linux.
radtek
Zaakceptowana odpowiedź nie działa na Ubuntu 14, ta działa!
rohithpr
Dodaj dodatkowe wyjaśnienie do swojej odpowiedzi - co to robi? dpkg-reconfiguremoże nie być dostępny dla wszystkich użytkowników, szczególnie w systemach, które nie są oparte na Debianie
Nico Haase
Naprawiłem moje source: not foundbłędy ze starymi klientami telnet po aktualizacji Debiana, dzięki.
bjoster
30

sourceWbudowane jest składnią Basha. Napisz to po prostu jako .zamiast.

na przykład

. $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
źródło
9

Ten problem występuje, ponieważ jenkins Execute Shell uruchamia skrypt za pośrednictwem swojego / bin / sh

W konsekwencji / bin / sh nie zna „źródła”

Wystarczy dodać poniższą linię na górze swojej powłoki Execute Shell w jenkins

#!/bin/bash
Mojtaba Yousefi
źródło
To pytanie nie dotyczy przecież Jenkinsa
Nico Haase
8

sourceKomenda jest wbudowany w niektórych muszli. Jeśli masz skrypt, powinien on określać, jakiej powłoki użyć w pierwszej linii, na przykład:

#!/bin/bash
mah
źródło
Cóż, mówi #! / Bin / sh, a na innym Linuksie, jeśli ręcznie wpiszę sh i zapytam "które źródło", powie: źródło: wbudowane polecenie powłoki
Milad
och, więc po to była ta linia. Zawsze się zastanawiałem. wielkie dzięki!
CommonSenseCode
5

Napotkałem ten błąd, gdy próbowałem wywołać polecenie źródła z powłoki #Jenkins.

source profile.txt lub source profile.properties

Zamiennikiem polecenia źródłowego jest użycie,

. ./profile.txt lub . ./profile.properties

Uwaga: między kropkami (.) Jest spacja.

GangaRam Dewasi
źródło
0

Znalazłem w gnu Makefile na Ubuntu, (gdzie / bin / sh -> bash)

Musiałem użyć. polecenie, a także określ skrypt docelowy z przedrostkiem ./ (patrz przykład poniżej)

źródło nie działało w tym przypadku, nie wiem dlaczego, skoro powinno wywoływać / bin / bash ..

Moja zmienna środowiskowa SHELL jest również ustawiona na / bin / bash

test:
    $(shell . ./my_script)

Zwróć uwagę, że ten przykład nie zawiera znaku tabulacji; musiał sformatować do wymiany stosu.

Gord Czekaj
źródło
0

source to wbudowane polecenie bash, więc aby wykonać polecenie source, możesz zalogować się jako Root.

sudo -s source ./filename.sh

swati jain
źródło
To nie wygląda na prawidłowe rozwiązanie. Co jeśli użytkownik nie ma uprawnień sudo? A pozyskane rzeczy są później dostępne tylko jako administrator, co spowoduje nowe problemy
Nico Haase
0

W Ubuntu, zamiast używać sh scriptname.sh do uruchomienia pliku, użyłem. scriptname.sh i zadziałało! Pierwsza linia mojego pliku zawiera: #!/bin/bash

użyj tego polecenia, aby uruchomić skrypt

.name_of_script.sh
DInfo2019
źródło
1
Na to odpowiedź udzielono już wiele razy. Podaj więcej informacji, jeśli w takim przypadku dodasz nową odpowiedź
Nico Haase
-3

To może ci pomóc, otrzymałem ten błąd, ponieważ próbowałem ponownie załadować moją .profilekomendą . .profilei wystąpił błąd składni

Kolob Canyon
źródło
-6

Powłoka Bourne'a (sh) używa PATH do zlokalizowania w source <file>. Jeśli plik, który próbujesz pozyskać, nie znajduje się w Twojej ścieżce, pojawi się komunikat o błędzie „nie znaleziono pliku”.

Próbować:

source ./<filename>
mosu
źródło
5
Post mówi, że sh: 1: source: not foundniefile not found
Cristian Chaparro A.