A opção -s
faz com que o bash leia os comandos de sua entrada padrão. Sem essa opção, o bash trata seu primeiro argumento como o nome de um script a ser executado. Com esta opção, o bash trata todos os seus argumentos como argumentos para o script que lê na entrada padrão. A opção -s
determina apenas como o bash interpreta seus argumentos de linha de comando, não se a instância do shell é interativa.
Uma instância do bash é sempre interativa se for iniciada com a opção -i
. Sem -i
, é interativo somente se nenhum nome de script for passado ( -s
influencia isso) e tanto a entrada padrão quanto o erro padrão estão conectados a um terminal.
O teste PS1
não informa se uma instância do shell é interativa.¹ Você pode desmarcar PS1
em um shell interativo. Por outro lado, um shell não interativo geralmente herda PS1
de seu ambiente. A maneira confiável de testar se o shell está sendo executado de forma interativa é testar se $-
contém i
.
O read
embutido funciona de qualquer shell, interativo ou não. Ele lê o que estiver conectado à entrada padrão do shell (a menos que seja redirecionado). Se você tentar ler o mesmo descritor de arquivo em que o bash está lendo o script que está sendo executado, você acabará ignorando uma linha no script (não necessariamente no local pretendido); por exemplo, se você estiver passando um script na entrada padrão do bash e quiser ler uma linha do terminal, será necessário redirecionar a read
call: read line </dev/tty
.
Os descritores de arquivo 0, 1 e 2 sempre existem (a menos que tenham sido fechados); eles são entrada padrão, saída padrão e erro padrão, respectivamente. Se o shell é interativo ou não, não está relacionado ao que os descritores padrão apontam, exceto que fd 0 e 2 são terminais que influenciam o status interativo do shell.
¹ Sim, estou ciente de que existem páginas da Web que reivindicam isso. Eles estão errados.