Я создаю небольшой сценарий автоматической настройки, который изменит /etc/profile
и $HOME/.profile
если некоторые пути не экспортируются. Затем я хотел бы автоматически перезагрузить их.
Я читал, что source
делает это, поэтому я запустил свой терминал и ввел:
source /etc/profilesource ~/.profile
С терминала он не выдал никакой ошибки.
Однако включение этих двух команд в сценарий Bash приводит к source: not found
.
- Как я могу быть уверен, что скрипт выполняется Bash, даже если
#!/bin/sh
указано (по-видимому, это не гарантирует этого)?
- Почему он говорит, что эти два источника не могут быть найдены, когда они безошибочно существуют?
/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
как хаос сказано в его ответ.