Komunikat o błędzie „źródło: nie znaleziono” podczas uruchamiania skryptu

35

Tworzę mały automatyczny skrypt instalacyjny, który zmodyfikuje się /etc/profilei $HOME/.profilejeśli niektóre ścieżki nie zostaną wyeksportowane. Następnie chciałbym ponownie załadować je automatycznie.

Przeczytałem, że sourceto robi, więc uruchomiłem terminal i wpisałem:

source /etc/profile
source ~/.profile

Z terminala nie wyświetlił żadnego błędu.

Jednak umieszczenie tych dwóch poleceń w skrypcie Bash powoduje source: not found.

  1. Jak mogę się upewnić, że skrypt jest wykonywany przez Bash, nawet jeśli #!/bin/shjest określony (najwyraźniej nie gwarantuje to)?
  2. Dlaczego miałoby to powiedzieć, że tych dwóch źródeł nie można znaleźć, skoro są tam niewątpliwie?
Yanick Rochon
źródło

Odpowiedzi:

54

/bin/shnie jest bash. Aby wykonać skrypt bash, napisz #!/bin/bashjako pierwszy wiersz skryptu.

Błąd source: not foundnie został usunięty, ponieważ /etc/profilenie został znaleziony. Został usunięty, ponieważ sourcenie został znaleziony. sourcejest wbudowaną funkcją Bash i nie wykonuje się skryptu za pomocą bash. Więc jasne jest, dlaczego go nie znaleziono. Zmień #!wiersz w skrypcie, a zadziała.

chaos
źródło
9

1. Jak mogę się upewnić, że skrypt jest wykonywany przez Bash, nawet jeśli #!/bin/shjest określony (najwyraźniej nie gwarantuje to)?

Aby mieć pewność, że skrypt napisany dla shpowłoki (jak w twoim przypadku - zobacz Jaka jest różnica między #! / Bin / sh i #! / Bin / bash? ) Jest wykonywany przez Bash, po prostu uruchom następującą komendę:

bash script_name

W ten sposób nie będziesz już otrzymywać tego błędu.

2. Dlaczego miałoby to powiedzieć, że tych dwóch źródeł nie można znaleźć, skoro są tam niewątpliwie?

Nie oznacza to, że nie ma tam tych pobranych plików. Mówi, że sourcepolecenie nie zostało znalezione. Jest to normalne, ponieważ skoro zaczynasz skrypt od #!/bin/shlinii, skrypt będzie działał, sha nie bashtak, jak myślisz. Dlaczego to jest normalne? Ponieważ sourcepolecenie jest wbudowane w Bash, ale nie jest shwbudowane. Aby uzyskać plik źródłowy sh, powinieneś użyć .(kropka). Przykład:

. /etc/profile
. ~/.profile

Innym sposobem jest zmiana linii shebang na, #!/bin/bashjak powiedział chaos w swojej odpowiedzi .

Radu Rădeanu
źródło
4

Zobacz to SO pytanie :

/bin/shjest zwykle jakąś inną powłoką próbującą naśladować Skorupę. Wiele dystrybucji używać /bin/bashdla sh, obsługuje źródła. Na Ubuntu /bin/dashjest jednak używany, który nie obsługuje źródła. Jeśli nie możesz edytować skryptu, spróbuj zmienić powłokę, która go uruchamia.

muru
źródło
1

Niektóre powłoki obsługują .zamiast source. Możesz więc spróbować czegoś takiego

. filename

zamiast

source filename

Mam nadzieję, że to działa

Shivam Agrawal
źródło