Um emulador de terminal executa um programa sempre indiretamente via shell?

1

Um emulador de terminal executa um programa sempre indiretamente via shell?

Por exemplo, quando abrimos uma janela do emulador de terminal, ela 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"

O xterm executa o programa, indiretamente via shell, ou diretamente sem shell?

    
por Tim 28.11.2018 / 01:13

3 respostas

4

Depende do emulador de terminal.

xterm primeiro chamará execvp(2) com os argumentos dados a -e , mas se isso falhar e houver um único argumento command após -e , ele também tentará $SHELL -c command .

mlterm e rxvt serão apenas erros se o execvp falhar.

Se meu segundo parágrafo não o convenceu, você pode tentar:

$ mkdir /tmp/tbin; ln -s /usr/bin/vi '/tmp/tbin/echo hello; sleep 5'
$ PATH=$PATH:/tmp/tbin xterm -e 'echo hello; sleep 5'

Ou veja a fonte .

    
por 28.11.2018 / 03:47
2

Com o seu exemplo, usando a opção -e , então xterm inicia um shell, o manual informa isso.

É possível sobrescrever a busca padrão do xterm por um shell, então você pode fornecer seu próprio programa para isso, mas quando você sobrescreve o shell, você não pode usar a opção -e. Quando você sobrescreve o shell, o seu shell é executado ( fork() + exec() ) diretamente pelo xterm.

Aqui estão as seções relevantes,

One  parameter  (after all options) may be given.  That overrides xterm's built-in choice of
shell program.  Normally xterm checks the SHELL variable.  If that is not set,  xterm  tries
to  use  the  shell  program specified in the password file.  If that is not set, xterm uses
/bin/sh.  If the parameter is not a relative path, i.e., beginning with “./” or “../”, xterm
looks for the file in the user's PATH.  In either case, it constructs an absolute path.  The
-e option cannot be used with this parameter since it  uses  all  parameters  following  the
option.

e

-e program [ arguments ... ]
   This option specifies the program (and its command line arguments) to be run in the
   xterm window.  It also sets the window title and icon name to be the basename of the
   program being executed if neither -T nor -n are given on  the  command  line.   This
   must be the last option on the command line.

E apenas observando o que você está executando,

"echo hello; sleep 5"

É o shell que analisa essa string, usa a variável PATH env para encontrar os dois comandos e percebe que são de fato dois comandos separados com o ponto e vírgula, xterm não faz isso!

    
por 28.11.2018 / 16:48
0

De acordo com o manual, você pode desabilitar o shell de login com o parâmetro +ls :

   +ls     This option indicates that the shell that is started should not
           be a login shell (i.e., it will be a normal “subshell”).

Então xterm -e "echo hello" gera um shell, mas xterm +ls -e "echo hello" não.

    
por 28.11.2018 / 01:18