Eu tenho um comando de pré-processo para gerar um arquivo
./preprocess.sh > preprocessed_file
e o preprocessed_file
será usado assim
while read line
do
./research.sh $line &
done < preprocessed_file
rm -f preprocessed_file
Existe alguma maneira de direcionar a saída para a while read line
peça em vez de enviar para o preprocessed_file? Eu acho que deveria haver uma maneira melhor do que usar esta temperatura preprocessed_file
.
shell
io-redirection
Marcus Thornton
fonte
fonte
<
é um redirecionamento, enquanto<(...)
é sintaxe de substituição de processo. Você deve ler: gnu.org/software/bash/manual/html_node/… para obter mais detalhes.<(...)
faz parte da sintaxe.read
é necessário ler um byte de cada vez, enquanto ele pode otimizar as coisas com a leitura de partes maiores e procurar retroceder ao ler de um arquivo comum. O melhor é evitar oswhile read
loops completamente, em primeiro lugar, quando possível. Observe também que você precisaIFS= read -r line
ler a linha$line
. E deixar sem$line
aspas (invocando o operador split + glob) aqui provavelmente não faz sentido.read
shell interno lê um caractere de cada vez ao ler de um tubo (independentemente do que está na outra extremidade do tubo queread
não tem como saber), que é um dos motivos pelos quais oswhile read
loops são tremendamente lentos.Sim! Você pode usar um tubo de processo
|
.Um tubo de processo passa a saída padrão (
stdout
) de um processo para a entrada padrão (stdin
) do próximo.Opcionalmente, você pode colocar um caractere de nova linha após a
|
e estender o comando para a próxima linha.Nota:
a|b
é equivalente ab < <(a)
, mas sem os arquivos mágicos, e em uma ordem mais legível, especialmente quando o pipeline fica mais longo.a|b|c
é equivalente ac < <(b < <(a))
e
a|b|c|d|e
ée < < (d < <(c < <(b < <(a))))
fonte
$line
aspas duplas (por exemplo, no seu script./research.sh "$line" &
).research.sh
funcionar com a matriz de argumentos da linha de comando e$line
for, por exemplo, "um dois", com a intenção de que o primeiro argumento seja "um" e o segundo argumento "dois", a citação$line
tornará isso impossível - em vez disso, o primeiro argumento será "um dois" e não haverá um segundo ...a|b
é equivalente ab < <(a)
" - fechar, mas não exatamente. Na versão do canal, os dois lados do canal são executados em subcascas, enquanto na versão de substituição de processo, apenas o processo substituído é executado em uma subcasca, masa
é executado no escopo do nível do shell atualmente em execução. Isso tem implicações importantes para o escopo das variáveis definidas em #a