O único verdadeiro equívoco que você parece ter é sobre o que constitui um shell de login não interativo.
Resumidamente (veja aqui para mais detalhes), com exemplos:
-
shell de login interativo: você faz login em um computador remoto por meio de, por exemplo,
ssh
. Alternativamente, você coloca um tty em sua máquina local ( Ctrl + Alt + F1 ) e efetua login lá. -
shell interativo de não-login: abra um novo terminal.
-
shell não-interativo não interativo: execute um script. Todos os scripts são executados em seu próprio subshell e esse shell não é interativo. Ele só abre para executar o script e fecha imediatamente quando o script é concluído.
-
shell de login não interativo: isso é extremamente raro, e você não consegue encontrá-lo. Uma maneira de iniciar um é
echo command | ssh server
. Quandossh
é iniciado sem um comando (portanto,ssh
em vez dessh command
, que executarácommand
no shell remoto), ele inicia um shell de login. Se ostdin
dossh
não for um tty, ele iniciará um shell não interativo. É por isso queecho command | ssh server
lançará um shell de login não interativo. Você também pode iniciar um combash -l -c command
.
Se você quiser brincar com isso, você pode testar os vários tipos de shell da seguinte forma:
-
Este shell é interativo?
Verifique o conteúdo da variável
$-
. Para shells interativos, incluirái
:## Normal shell, just running a command in a terminal: interacive $ echo $- himBHs ## Non interactive shell $ bash -c 'echo $-' hBc
-
Este é um shell de login?
Há não maneira portátil de verificar isso, mas, para o bash, você pode verificar se a opção
login_shell
está definida:## Normal shell, just running a command in a terminal: interacive $ shopt login_shell login_shell off ## Login shell; $ ssh localhost $ shopt login_shell login_shell on
Colocando tudo isso junto, aqui está um de cada tipo possível de shell:
## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell off
## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell on
## Non-interactive, non-login shell
$ ssh localhost 'echo $-; shopt login_shell'
hBc
login_shell off
## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell on