it-roy-ru.com

Сообщение об ошибке «источник: не найден» при запуске скрипта

Я создаю небольшой скрипт автоматической установки, который изменит /etc/profile и $HOME/.profile, если некоторые пути не будут экспортированы. Затем я хотел бы перезагрузить их автоматически.

Я прочитал, что source делает это, поэтому я запустил свой терминал и ввел:

source /etc/profile
source ~/.profile

Из терминала не выводилось ни одной ошибки.

Однако размещение этих двух команд внутри скрипта Bash приводит к source: not found.

  1. Как я могу быть уверен, что скрипт выполняется Bash, даже если указан #!/bin/sh (по-видимому, это не гарантирует)?
  2. Почему бы сказать, что эти два источника не могут быть найдены, когда они безошибочно там?
29
Yanick Rochon

/bin/sh не является bash. Чтобы выполнить ваш скрипт с bash, напишите #!/bin/bash в качестве первой строки в вашем скрипте.

Ошибка source: not found не сбрасывается, поскольку /etc/profile не найден. Это отброшено, потому что source не найден. source является встроенной функцией Bash, и вы не выполняете сценарий с bash. Так что понятно, почему его не нашли. Измените строку #! в скрипте, и она будет работать.

44
chaos

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

Другой способ - изменить строку Шебанга на #!/bin/bash, указав хаос в его ответ .

8
Radu Rădeanu

Смотрите это ТАК вопрос :

/bin/sh - это обычно какая-то другая оболочка, пытающаяся имитировать оболочку. Многие дистрибутивы используют /bin/bash для sh, он поддерживает источник. В Ubuntu, однако, используется /bin/dash, который не поддерживает источник. Если вы не можете отредактировать скрипт, попробуйте изменить оболочку, которая его запускает.

4
muru