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

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

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

source /etc/profile
source ~/.profile

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

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

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

4 ответа

/bin/sh не bash. Для выполнения сценария с bash запишите #!/bin/bash как первая строка в сценарии.

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

53
ответ дан 31 July 2014 в 14:27

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

Быть уверенным что сценарий, записанный для sh оболочка (как в Вашем случае - видят то, Что различие между #!/bin/sh и #!/bin/bash?) выполняется Bash, просто выполните следующую команду:

bash script_name

Таким образом Вы не будете больше получать ту ошибку.

2. Почему это сказало бы, что эти два источника не могут быть найдены, когда они явно там?

Это не говорит, что те полученные файлы не там. Это говорит что source команда не найдена. Это нормально, потому что, так как Вы запускаете свой сценарий с #!/bin/sh строка, Ваш сценарий выполнит использование sh и нет bash поскольку можно думать. Почему это нормально? Поскольку source команда является встроенным Bash, но не a sh встроенный. Получать файл в sh, необходимо использовать . (точка). Пример:

. /etc/profile
. ~/.profile

Иначе должен изменить строку хижины на #!/bin/bash как хаос, сказанный в его ответе.

9
ответ дан 31 July 2014 в 14:27

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

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

4
ответ дан 31 July 2014 в 14:27

Некоторая поддержка оболочек . вместо source. Таким образом, можно попробовать что-то вроде этого

. filename

вместо

source filename

Hope, это работает

1
ответ дан 23 November 2019 в 00:27

Другие вопросы по тегам:

Похожие вопросы: