Eu escrevi uma função wrapper para essa finalidade, que você pode usar se quiser reutilizar uma linha de saída de um comando.
Primeiro a função para bash :
catch() {
out="$($@)"
nl <<< "$out"
read -a r -d '\n' <<< "$out"
r=("dummy" "${r[@]}")
}
Então, para zsh :
catch () {
out="$($@)"
nl <<< "$out"
r=("${(@f)out}")
}
O uso é para as duas variantes iguais. Primeiro, execute o comando desejado, prefixado com catch , que apresentará a saída do comando com uma boa numeração:
$ catch grep -Irl "foo"
1 path/to/dir/task.js
2 path/to/dir/help.js
3 path/to/dir/config.js
$
Agora, você pode reutilizar qualquer linha em um comando a seguir usando o parâmetro de matriz $r
, por exemplo,
$ wc -c ${r[2]}
14044 path/to/dir/help.js
Em zsh você pode omitir as chaves ( wc -c $r[2]
) mas em bash você precisa delas infelizmente.
Algumas ressalvas que vêm à minha mente:
- a saída só é exibida após o término do comando
- caracteres estranhos na saída podem produzir um comportamento errático (por exemplo, novas linhas no nome do arquivo)
- apenas a saída para STDOUT é capturada (se alguma saída for gravada em STDERR, ela será desfeita no console e ignorada em
$r
)