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?


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.


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

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


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


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

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

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.


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.


0

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

sudo -s source ./filename.sh


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

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


-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>

5
Post mówi, że sh: 1: source: not foundniefile not found
Cristian Chaparro A.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.