2012-12-04 13 views
61

Mam skrypt linuxa, który używa powłoki sh. Wystąpił błąd w linii, która używa polecenia "source". Zasadniczo wydaje się, że "źródło" nie jest zawarte w mojej powłoce sh. Jeśli wpiszesz sh i wprowadzę źródło, otrzymam:Nie znaleziono polecenia źródła w powłoce sh

sh: 1: source: not found 

Czy powinienem jawnie zainstalować "źródło"? Czy mam złą wersję powłoki sh?

+1

Jedno można zasadnie twierdzić, że pocisk, który obsługuje 'source' jest„zła wersja”. –

+1

Ponadto komunikat o błędzie "source: not found" oznacza, że ​​polecenie 'source' zostało poprawnie ocenione, ale plik, który powinien mieć odczyt, nie istnieje. –

Odpowiedz

50

/bin/sh jest zwykle jakaś inna powłoka próbuje naśladować powłoki. Wiele dystrybucji używa /bin/bash dla, obsługuje source. W systemie Ubuntu jest jednak używana wersja /bin/dash, która nie obsługuje source. Jeśli nie możesz edytować skryptu, spróbuj zmienić powłokę, która go uruchamia.

+2

Dzięki! Wymiana/bin/sh z/bin/bash działało na Ubuntu! Jestem ciekawy dlaczego, czy to oznacza na Ubuntu bash sh? – Milad

+1

@Milad: W ostatnim Ubuntusie, '/ bin/sh' wywołuje'/bin/dash'. Tradycyjnie, '/ bin/sh' nazywane'/bin/bash' jest trybem zgodności sh. – choroba

+0

@Milad Myślę, że to nie działa na Ubuntu 14.04. Jaka jest twoja wersja systemu operacyjnego? –

58

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

. filename 
+0

Naprawdę nie mogę zmienić skryptu, działa dobrze na serwerze redhat. Ale na tym serwerze źródło wydaje się być zawarte w sh – Milad

+2

Jeśli ma 'source', to nie jest to' sh'. – tripleee

+2

Miałem tego rodzaju problem na Jenkins (próbując źródła pliku przechowywanego jako "tajny plik") i pozyskiwania przez "." polecenie było rozwiązaniem. –

6

Komenda source jest wbudowany w niektórych muszli. Jeśli masz skrypt, należy określić, jakie powłoki do wykorzystania na pierwszej linii, takich jak:

#!/bin/bash 
+0

Cóż, napisałem #!/Bin/sh i na innym systemie Linux, jeśli ręcznie wprowadzę sh i zapytam "jakie źródło", to mi mówi: source: shell wbudowane polecenie – Milad

+0

oh, więc to jest to, do czego służy ta linia. Zawsze się zastanawiałem. wielkie dzięki! – commonSenseCode

28
$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 OK

+0

Miło! Używam serwerów RHEL i Ubuntu i zawsze mam małe problemy, takie jak ten z Ubuntu. Naprawdę lubię RHEL i RHEL jak linux. – radtek

+0

Przyjęta odpowiedź nie działa w systemie Ubuntu 14, to prawda! – rohithpr

0

Bourne shell (sh) używa ścieżki do zlokalizowania w source <file>. Jeśli plik, który próbujesz pobrać, nie znajduje się na twojej ścieżce, pojawi się błąd "nie znaleziono pliku".

Spróbuj:

source ./<filename> 
+2

Post mówi "sh: 1: source: not found' not 'file not found' –

0

znalazłem w GNU Makefile na Ubuntu (gdzie/bin/sh -> bash)

Musiałem użyć. poleceń, jak również określić skrypt docelową z ./ prefiksem (patrz przykład poniżej)

źródło nie działa w tym przypadku, nie wiem dlaczego, ponieważ należy nazywając/bin/bash ..

My Zmienna środowiskowa SHELL jest również ustawiona na/bin/bash

test: 
    $(shell . ./my_script) 

Uwaga: ta próbka nie zawiera znaku tabulacji; musiałem sformatować do wymiany stosów.

3

Ten problem występuje, ponieważ Jenkins Execute Shell uruchamia skrypt poprzez jego/bin/sh

konsekwencji/bin/sh nie wiem "źródło"

Wystarczy dodać poniższy wiersz na góry Wykonaj Shell w Jenkins

#!/bin/bash 
-1

to może pomóc, byłem coraz to błąd, ponieważ starałem się odświeżyć moje .profile z poleceniem . .profile i miał błąd składni

0

źródło jest bash wbudowanego polecenia tak, aby wykonać polecenie source, można zalogować się jako root.

sudo -s source ./filename.sh