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

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

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

source /etc/profilesource ~/.profile

С терминала он не выдал никакой ошибки.

Однако включение этих двух команд в сценарий Bash приводит к source: not found.

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

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

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

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

. filename

вместо

source filename

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

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 как хаос сказано в его ответ.

Видишь это ИТАК, вопрос:

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