O motivo desse comportamento está documentado na página de manual das versões recentes de su
:
-c, --command COMMAND
Specify a command that will be invoked by the shell using its
-c
.The executed command will have no controlling terminal. This option cannot be used to execute interractive programs which need a controlling TTY.
(ênfase minha)
Quando você executa comandos básicos, como ls
, echo
ou bash --version
, eles simplesmente imprimem sua saída para o fluxo stdout
sem precisar de um terminal de controle.
Eu suspeito que o caminho bash
esteja sendo chamado (como um shell interativo) ou some-script.sh
contenha comandos que requerem um dispositivo terminal de controle, portanto, executar 'bash some-script.sh'
gera o erro cannot set terminal process group (-1): Inappropriate ioctl for device
.
Alguma explicação
Um controlador de terminal para um processo é o dispositivo terminal a partir do qual o processo foi iniciado. Um terminal de controle pode enviar sinais para grupos de processos e é o mecanismo pelo qual o controle de trabalho funciona em sistemas operacionais Unix; O controle de trabalho permite que os processos no grupo de processos sejam executados em primeiro plano ou em segundo plano.
A saída do comando ps
mostra o terminal de controle de cada processo, por exemplo,
$ ps
PID TTY TIME CMD
3614 pts/5 00:00:00 bash
31628 pts/5 00:00:00 ps
Mudança recente no su
No passado, su -c
iniciava um terminal de controle quando não estava executando um shell interativo. A execução de apt-get changelog login
no meu sistema Ubuntu mostra que a remoção do terminal de controle foi introduzida em maio de 2012 como uma medida de segurança:
- su: Fix possible tty hijacking by dropping the controlling terminal when executing a command (CVE-2005-4890). Closes: #628843