lido do script stdin no script heredoc canalizado para 'sh'

0

Isso funciona como esperado

$> cat ./readfromstdin.sh
echo reading
cat /dev/stdin

$> echo hello | ./readfromstdin.sh
reading
hello

Estou tentando conseguir algo semelhante sem um arquivo temporário. Minha primeira tentativa foi

echo hello | (echo cat /dev/stdin|sh)

que não funcionou. Com um heredoc, também não funcionou (embora não tenha certeza de qual seria a sintaxe correta:

echo hello | (cat << EOF | sh
cat /dev/stdin
EOF)
pipe cmdsubst pipe heredoc>

É possível ler a partir de stdin usando um script canalizado para o shell?

    
por luksen 19.04.2017 / 11:11

2 respostas

1

Você pode fazer o que descreve com relativa facilidade ao direcionar para um subshell:

$ echo hello | ( echo reading; cat /dev/stdin )
reading
hello

Admito que não consigo imaginar nenhum caso de uso para isso. Por que não apenas fazer:

$ echo hello | ( echo reading; read var; echo "$var")
reading
hello

Dessa forma, você tem o conteúdo stdin salvo como uma variável e pode manipulá-lo como quiser.

    
por 19.04.2017 / 11:26
0
$ echo 'world' |  { echo 'hello'; cat }
hello
world

Não é necessário fornecer explicitamente /dev/stdin a cat , pois é isso que cat opera por padrão se nenhum outro operando for fornecido.

No seu próprio código, parece que você quer passar um comando em vez de uma string para a saída. É assim que eu interpreto a presença de sh no código. Eu não tenho certeza se você precisa disso.

O problema que você está tendo em fazer é devido ao fato de alimentar o script para sh em sua entrada padrão. A entrada padrão será reservada para os comandos, então a inserção de uma string nela não funcionará.

    
por 15.05.2017 / 18:11