Os comandos em um script são executados um por um, independentemente. O próprio Script como o pai de todos os comandos do script é outro processo independente e o comando su não o altera e não pode ser alterado para root: o comando su cria um novo processo com privilégios de root.
Após a conclusão do comando su, o processo pai, ainda em execução como o mesmo usuário, executará o restante do script.
O que você deseja fazer é escrever um script de wrapper. Os comandos privilegiados vão para o script principal, por exemplo~/main.sh
#!/bin/sh
ls /root
O script do wrapper chama o script principal com permissões de root, assim
#!/bin/sh
su -c ~/main.sh root
Para iniciar esse processo, você executa o wrapper, que, por sua vez, inicia o script principal após alternar o usuário para o usuário raiz.
Essa técnica de invólucro pode ser usada para transformar o script em um invólucro. Basicamente, verifique se está sendo executado como root; caso contrário, use "su" para se reiniciar.
$ 0 é uma maneira prática de fazer um script se referir a si mesmo, e o comando whoami pode nos dizer quem somos (somos root?)
Portanto, o script principal com o invólucro interno se torna
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Observe o uso de exec. Significa "substituir este programa por", que efetivamente encerra sua execução e inicia o novo programa, lançado por su, com root, para executar a partir do topo. A instância de substituição é "root", portanto, não executa o lado direito do ||
sudo su
faz meus olhos doerem.