Повідомлення про помилку "джерело: не знайдено" під час запуску сценарію


35

Я створюю невеликий автоматизований сценарій налаштування, який буде модифікований /etc/profileі $HOME/.profileякщо деякі шляхи не експортуються. Потім я хотів би перезавантажити їх автоматично.

Я читав, що sourceце робить, тому я запустив свій термінал і ввійшов:

source /etc/profile
source ~/.profile

З терміналу він не видав жодної помилки.

Однак введення цих двох команд всередині сценарію Bash призводить до source: not found.

  1. Як я можу бути впевнений, що сценарій виконується Bash, навіть якщо #!/bin/shвін вказаний (мабуть, це не гарантує)?
  2. Чому б сказати, що цих двох джерел неможливо знайти, коли вони безпомилково там?

Відповіді:


54

/bin/shне є bash. Щоб виконати свій сценарій bash, напишіть #!/bin/bashяк перший рядок у вашому сценарії.

Помилка source: not foundне падає, тому що /etc/profileне знайдена. Він скинутий, бо sourceне знайдений. source- це вбудована функція Bash, і ви не виконуєте сценарій за допомогою bash. Тож зрозуміло, чому його не знайдено. Змініть #!рядок у сценарії, і він спрацює.


9

1. Як я можу бути впевнений, що сценарій виконується Bash, навіть якщо #!/bin/shвін вказаний (мабуть, це не гарантує)?

Щоб переконатися, що сценарій, написаний для shоболонки (як у вашому випадку - див. Яка різниця між #! / Bin / sh і #! / Bin / bash? ), Виконується Bash, просто запустіть таку команду:

bash script_name

Таким чином, ви більше не отримаєте цю помилку.

2. Чому можна сказати, що цих двох джерел неможливо знайти, коли вони безпомилково є?

Це не говорить про те, що цих джерел файлів немає. Це говорить про те, що sourceкоманда не знайдена. Це нормально, тому що, оскільки ви починаєте свій сценарій з #!/bin/shрядком, ваш сценарій буде працювати з використанням, shа не так, bashяк вам здається. Чому це нормально? Тому що sourceкоманда - це вбудований Bash, але не shвбудований. Щоб створити файл у файлі sh, слід використовувати .(крапка). Приклад:

. /etc/profile
. ~/.profile

Інший спосіб полягає в тому, щоб змінити лінію shebang так, #!/bin/bashяк сказав хаос у своїй відповіді .


4

Дивіться це питання ТАК :

/bin/shзазвичай це якась інша оболонка, яка намагається імітувати Оболонку. Багато дистрибутивів використовують /bin/bashдля цього sh, він підтримує джерело. На Ubuntu, однак, /bin/dashвикористовується, який не підтримує джерело. Якщо ви не можете відредагувати сценарій, спробуйте змінити оболонку, яка його запускає.


1

Деякі снаряди підтримують .замість source. Тож ви можете спробувати щось подібне

. filename

замість

source filename

Сподіваюся, це спрацює

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.