Когда вы печатаете это
su www-data whatever something-else exit
su
запускает дополнительную оболочку от имени www-data
пользователя. Затем вы вводите последовательные команды, они выполняются в этой оболочке, поэтому exit
вы возвращаетесь к старой оболочке.
Если эти команды находятся в скрипте, whatever
они не будут выполняться в дополнительной оболочке. Исходная оболочка будет ожидать su
выхода, прежде чем она пойдет в whatever
и дальше. Если вы запустите такой скрипт (файл script.sh
с правильным shebang) из терминала, вы попадете в интерактивную оболочку. Введите exit
там вручную, чтобы продолжить со сценарием.
Теперь внутри скрипта начальной загрузки нет прикрепленного TTY, он su www-data
не может запустить интерактивную оболочку и немедленно завершает работу. Остальная часть скрипта выполняется (очевидно, не как www-data
пользователь); и если есть exit
где-то, он выйдет из сценария.
Чистейший способ справиться с ней, чтобы вставить whatever
и something-else
в отдельный хелперах сценарий, то вы можете вызвать в основном сценарии
su www-data -c "/path/to/the/helper/script"
Основной скрипт будет ждать su
выхода. Когда это происходит, любая следующая строка выполняется исходным пользователем.
Другой способ таков:
su www-data -c 'whatever; something-else'
или эквивалентно
su www-data -c ' whatever something-else '
Последний подход может быть проблематичным, если команды нуждаются в цитировании. С дополнительным скриптом такой проблемы нет.