O script precisa ler a linha ecoada

2

Então, eu preciso escrever um script Bourne-shell, onde meu script tem que trabalhar com a linha, que acabou de ser repetido para stdout - por exemplo:

echo *something* | myscript.sh [parametres...] 

Isso pode ser uma coisa básica, o que eu poderia ter perdido durante meus estudos. Eu incluiria minhas tentativas, mas elas não estão nem perto da solução. De qualquer forma, qualquer dica apreciada.

    
por Wanderer 19.05.2014 / 00:05

3 respostas

4

A principal coisa a ter em conta aqui é que os filhos herdam os descritores de arquivo STDIN / STDOUT / STDERR de seus pais. Ou seja, se você iniciar um script com STDIN conectado ao STDOUT de outro processo (um pipe, como o seu exemplo), qualquer coisa iniciada por esse script também terá STDIN conectado ao mesmo STDOUT do outro processo.

Isso significa que você faz echo foo | ./myscript.sh , em que myscript.sh é:

#!/bin/bash
sed -e 's/foo/bar/'

, em seguida, sed lerá o echo foo e gravará no STDOUT (que será conectado ao seu TTY, pois não foi redirecionado quando myscript.sh foi lançado).
Exemplo:

$ echo foobar | ./myscript.sh
barbar

Então, como você usa isso depende do que você quer fazer. Se você simplesmente quiser capturar a entrada em uma variável, poderá usar o read incorporado para fazer isso.
Por exemplo:

#!/bin/bash
IFS= read -rd '' foo
echo "foo=<$foo>"

O que resulta em:

$ echo -e 'hello\nworld' | ./myscript.sh
foo=<hello
world>
    
por 19.05.2014 / 00:34
0
echo " foo bar " | {
# ...
IFS= read -r line
echo "$line"
}
    
por 19.05.2014 / 00:31
0

A saída padrão do lado esquerdo do tubo é conectada à entrada padrão do lado direito do tubo. No seu exemplo, a saída de echo se torna a entrada para myscript.sh .

Se você quiser armazenar toda a saída de echo em uma variável, poderá usar uma substituição de comando com cat .

whole_input=$(cat)

Isso remove as linhas novas no final da entrada.

Você também pode usar o read builtin se quiser ler uma linha por vez. Observe que o% normal read divide a linha em campos e usa continuações de contrabarra; para ler uma linha sem complicações adicionais, use IFS= read -r :

IFS= read -r first_line
IFS= read -r second_line
    
por 19.05.2014 / 04:52