Eu quero fazer algo assim:
echo whoami | sh
O comando whoami
roda em sh
, mas como o pipeline como um todo roda em um subshell, o sh
interpretador sai em vez de me dar um prompt de shell. Sem usar o -c
argumento, como posso enviar alguma entrada para sh
e deixá-lo rodando?
Preciso saber porque sh
este é apenas um exemplo; tenho um programa diferente que tem um interpretador interativo, mas não tem o equivalente a um -c
argumento.
O problema é seu
echo
, porque ele fecha o pipe depois que a string é produzidawhoami\n
.E quanto a:
Se você quer dizer que a
sh
entrada de deve ser primeiro um pipe e depois mudar para ser o arquivo de dispositivo de terminal através do qual seu terminal interage, então você pode usarcat
como Marcus mostrou para encaminhar o que vem daquele arquivo de dispositivo para o pipe enquantosh
a entrada de permanece no pipe, ou no caso desh
, você pode dizer para ele reabrir seu stdin no arquivo de dispositivo de terminal enviando a ele o código para fazer isso:Note que, como
sh
é iniciado com algo que não é um dispositivo tty como stdin, ele não entra em sua operação de modo interativo, onde ele emite um prompt, por exemplo. Mas você pode contornar isso passando a-i
opção:Dependendo da
sh
implementação, você pode ou não ver o eco dessawhoami; exec < /dev/tty
linha de comando.O acima foi com a
dash
implementação desh
. Com a implementação GNU desh
(bash):Observe que
/dev/tty
acima há um atalho que se refere ao terminal de controle da sessão, mais fácil do que obter seu caminho real.Como alternativa, você pode salvar o stdin original duplicando-o em um fd diferente com algo como:
Isso seria mais limpo, pois continuaria funcionando mesmo em contextos onde o código não é executado em um terminal, mas recebe entrada de outro lugar.