Encontrei o seguinte man bash
como definição de shell interativo:
Um shell interativo é aquele iniciado sem argumentos não opcionais (a menos que -s seja especificado) e sem a opção -c cuja entrada padrão e erro são ambos conectados a terminais (conforme determinado por isatty(3)), ou um iniciado com a opção -i. PS1 é definido e $- inclui i se o bash for interativo, permitindo que um script de shell ou um arquivo de inicialização teste esse estado.
Então, shell interativo é aquele que:
- não tem argumentos não opcionais (a menos
-s
que seja especificado), não tem-c
opção e cuja entrada padrão e erro estão conectados ao terminal; ou - tem
-i
opção
Eu escrevi o seguinte exemplo:
bash << EOF
echo '$-'
EOF
e fornece a seguinte saída:
himBHs
Então, parece que é um shell interativo (ele tem i
). No entanto, não está claro para mim como ele pode ser interativo quando a entrada padrão não é um terminal neste caso... O seguinte está escrito na documentação para este tipo de redirecionamento ( here documents
):
Este tipo de redirecionamento instrui o shell a ler a entrada da fonte atual até que uma linha contendo apenas delimitador (sem espaços em branco à direita) seja vista. Todas as linhas lidas até esse ponto são então usadas como a entrada padrão (ou descritor de arquivo n se n for especificado) para um comando.
Ele diz que a entrada padrão são todas as linhas lidas até o delimitador (eu assumo que elas são então passadas para o comando redirecionando a entrada padrão do comando para um pipe ou algo assim). Portanto, a entrada padrão não é (conectada a) um terminal.
Por que isso está acontecendo? Por que o bash é interativo nesse caso?
Não é.
O shell externo - interativo - está se expandindo
$-
(as aspas não são especiais neste contexto - comparebash -c "echo '$-'"
) e passandoecho 'himBHs'
para o shell interno. Você pode verificar isso substituindobash
porbash -v
:Você pode evitar isso usando o caractere de barra invertida para citar
$
ou citando o delimitador heredoc em vez disso