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

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он указан (по-видимому, это не гарантирует)?

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

bash script_name

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

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

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

. /etc/profile
. ~/.profile

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

Раду Рэдяну
источник
4

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

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

Мур
источник
1

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

. filename

вместо того

source filename

Надеюсь, что это работает

Шивам Агравал
источник