Como a execução de um arquivo altera a entrada std?

1

Imagine que eu tenha um script, que contém o comando goto.

O comando goto irá procurar na entrada padrão por uma linha como esta : jumpHere .

Mas a entrada std é por padrão o terminal. Só faz sentido se o arquivo / script é a entrada std para o comando goto. Então, onde / quem / o que está mudando a entrada std?

ps. Estou falando do antigo Thompson-Shell, Unix v6.

    
por Joey 05.01.2015 / 23:48

1 resposta

2

Observe que goto era um utilitário separado, portanto, não faz parte do shell Thompson por si.

Quando você invoca o shell Thomson como:

sh the-script

sh abre the-script em stdin (fd 0) como se você tivesse escrito

sh < the-script

em vez disso.

O comando goto irá seek stdin voltar para o início (o que obviamente se stdin fosse um terminal e não um arquivo normal não funcionaria) então procure o rótulo lá e deixe o cursor no arquivo logo depois disso. Então a casca continuaria daí.

Se você quiser que um comando em seu script leia o que era stdin originalmente, use o operador de redirecionamento especial <- :

cmd <- 

Observe que com o mesmo comando goto , seu script também funcionará com bash se você invocar seu script de shell da Thomson como:

bash < the-script

ksh93 pode emular esse goto com operadores de redirecionamento procurando especiais. Por exemplo, este script de shell da Thomson:

echo Start
: start
ls -ld /proc/self/fd/0
sleep 1
goto start
echo End never reached

Pode ser escrito em ksh93 como:

echo Start
: start
ls -ld /proc/self/fd/0
sleep 1
exec <#((0)) <#": start"
echo End never reached

Ambos seriam executados (desde que você tenha o comando V6 goto ) com ksh93 quando chamado como:

ksh93 < the-script
    
por 06.01.2015 / 00:42