O Linux (como muitas outras variantes do Unix) suporta apenas passar um único argumento para o interpretador de um script. (O interpretador é o programa na linha shebang.) Um script começando com #!/usr/bin/sudo -u bob -- /bin/bash é executado chamando /usr/bin/sudo com os argumentos -u bob -- /bin/bash e /home/alice/script.sh .
Uma solução é usar um script de wrapper: fazer /home/alice/script.sh contain
#!/bin/sh
exec sudo -u bob /home/alice/script.real
e coloque o código em /home/alice.script.real começando com #!/bin/bash e faça a regra sudo se referir a /home/alice.script.real .
Outra solução é fazer com que o script se reexecute. Você precisa ter cuidado para detectar a condição desejável corretamente, caso contrário você corre o risco de criar um loop infinito.
#!/bin/bash
if ((EUID != 123)); then
exec sudo -u \#123 /home/alice/script.sh
fi
(onde 123 é o ID do usuário de bob )
Uma solução simples é dizer às pessoas para executar sudo -u bob /home/alice/script.sh em vez de executar o script diretamente. Você pode fornecer aliases de shell, .desktop files, etc.