Я создаю небольшой сценарий автоматической настройки, который изменит /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 как хаос сказано в его ответ.