O Bash pode executar scripts do pipeline. Um exemplo mínimo seria:
> echo "echo hello world" | bash
hello world
Isso é útil se você deseja executar um script baixado de curl
ou wget
.
Mas aparentemente, você não pode usar read
esse tipo de execução de script. Por exemplo,
#!/bin/bash
echo 'input: '
read HELLO
echo hello: $HELLO
Se você simplesmente executar o script acima a partir de um arquivo de script bash, poderá inserir o valor de $HELLO
. e o echo hello: $HELLO
imprimirá o resultado.
Se você alimentar o script da maneira que falamos anteriormente:
> echo "echo 'input: '; read HELLO; echo hello: $HELLO" | bash
input:
hello:
Você não terá a interação em tudo. E $HELLO
continua vazio. Eu também tentei adicionar -i
opção no bash, e não funcionou.
Existe alguma maneira que podemos usar read
no script em pipeline? Como? Ou, se não podemos, por quê?
read
irá "interagir" com o usuário através do stdin (de onde lerá as coisas) e stderr (de onde imprimirá seu-p
prompt, se houver).Se o stdin for o script ,
read
obterá suas coisas dele, fazendo com que ele pule uma linha:Isso dificilmente é uma boa prática e não funcionará em todos os shells. Observe também que ao canalizar scripts via stdin,
bash
terá que lê-los byte-by-byte.No seu exemplo, todo o seu script era uma única linha, então o
read
builtin apenas obterá EOF e não definirá nenhuma variável.Se você quiser
read
sempre ler do tty de controle, redirecione-o explicitamente:Isso também deve ser usado com moderação. Ninguém vai gostar de você se tiver que usar
expect(1)
para instrumentar seu roteiro.