Um emulador de terminal executa um programa sempre indiretamente via shell?
Por exemplo, quando abrimos uma janela de emulador de terminal, ele executa automaticamente um shell e só podemos digitar comandos no shell.
Por exemplo, ao executar um programa diretamente em um emulador de terminal, como
xterm -e "echo hello; sleep 5"
Executa xterm
o programa, indiretamente via shell, ou diretamente sem shell?
Depende do emulador de terminal.
xterm
chamará primeiroexecvp(2)
com os argumentos fornecidos a-e
, mas se isso falhar e houver um únicocommand
argumento a seguir-e
, ele também tentará$SHELL -c command
.mlterm
erxvt
só vai dar erro se aexecvp
falha.Se meu segundo parágrafo não te convenceu, você pode tentar isto:
Ou veja a fonte .
Com o seu exemplo, usando a
-e
opção, entãoxterm
iniciará um shell, o manual informa isso.É possível substituir a pesquisa padrão do xterm por um shell, então você pode fornecer seu próprio programa para isso, mas quando você substitui o shell, não pode usar a opção -e. Quando você substitui o shell, seu shell é executado (
fork() + exec()
) diretamente pelo xterm.Aqui estão as seções relevantes,
e
E apenas olhando para o que você está executando,
É o shell que analisa essa string, ele usa a
PATH
variável env para encontrar os dois comandos e percebe que são de fato dois comandos separados por ponto e vírgula,xterm
não faz isso!De acordo com o manual, você pode desabilitar o shell de login com o parâmetro
+ls
:Então
xterm -e "echo hello"
gera um shell, masxterm +ls -e "echo hello"
não.