Команды в скрипте выполняются одна за другой, независимо. Сам скрипт, как родитель всех команд в скрипте, является другим независимым процессом, а команда su не изменяет и не может изменить его на root: команда su создает новый процесс с привилегиями root.
После завершения этой команды su родительский процесс, все еще работающий от имени того же пользователя, выполнит оставшуюся часть сценария.
Что вы хотите сделать, это написать скрипт-обертку. Привилегированные команды входят в основной скрипт, например~/main.sh
#!/bin/sh
ls /root
Скрипт-обертка вызывает основной скрипт с правами root, как это
#!/bin/sh
su -c ~/main.sh root
Для запуска этого процесса вы запускаете оболочку, которая, в свою очередь, запускает основной скрипт после переключения пользователя на пользователя root.
Эту технику обертки можно использовать, чтобы превратить скрипт в обертку вокруг себя. В основном проверьте, работает ли он как root, если нет, используйте su для повторного запуска.
$ 0 - это удобный способ заставить скрипт ссылаться на себя, а команда whoami может сказать нам, кто мы (мы root)?
Таким образом, основной скрипт со встроенной оберткой становится
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Обратите внимание на использование exec. Это означает «заменить эту программу на», что фактически завершает ее выполнение и запускает новую программу, запускаемую su с root, для запуска сверху. Экземпляр замены - «root», поэтому он не выполняет правую часть ||
sudo su
заставляет мои глаза болеть.