Tengo un comando de preproceso para generar un archivo
./preprocess.sh > preprocessed_file
y preprocessed_filese usará así
while read line
do
./research.sh $line &
done < preprocessed_file
rm -f preprocessed_file
¿Hay alguna forma de dirigir la salida a la while read lineparte en lugar de enviarla al archivo preprocesado? Creo que debería haber una mejor manera que no sea usar esta temperatura preprocessed_file.
shell
io-redirection
Marcus Thornton
fuente
fuente

<es una redirección, mientras que<(...)es la sintaxis de sustitución del proceso. Debería leer: gnu.org/software/bash/manual/html_node/… para más detalles.<(...)es parte de la sintaxis.readtiene que leer un byte a la vez, mientras que puede optimizar las cosas con la lectura de fragmentos más grandes y buscar hacia atrás cuando se lee desde un archivo normal. Lo mejor es evitar loswhile readbucles por completo en primer lugar cuando sea posible. También tenga en cuenta que necesitaIFS= read -r lineleer la línea$line. Y dejar sin$linecomillas (invocando al operador split + glob) aquí probablemente no tiene sentido.readshell incorporado lee un carácter a la vez cuando lee desde una tubería (independientemente de lo que hay en el otro extremo de la tubería quereadno tiene forma de saber), que es una de las razones por las que loswhile readbucles son tremendamente lentos.¡Si! Puede usar una tubería de proceso
|.Una tubería de proceso pasa la salida estándar (
stdout) de un proceso a la entrada estándar (stdin) del siguiente.Opcionalmente, puede poner un carácter de nueva línea después de a
|y extender el comando a la siguiente línea.Nota:
a|bes equivalente ab < <(a), pero sin los archivos mágicos, y en un orden más legible, especialmente cuando la tubería se hace más larga.a|b|ces equivalente ac < <(b < <(a))y
a|b|c|d|eese < < (d < <(c < <(b < <(a))))fuente
$linecomillas dobles (por ejemplo, en su secuencia de comandos./research.sh "$line" &).research.shfunciona con la matriz de argumentos de la línea de comandos y$linees, por ejemplo, "uno dos", con la intención de que el primer argumento sea "uno" y el segundo argumento "dos", las citas$linelo harán imposible; en cambio, el primer argumento será "uno dos" y no habrá un segundo ...a|bes equivalente ab < <(a)" - cerca, pero no del todo. En la versión de tubería, ambos lados de la tubería se ejecutan en subcapas, mientras que en la versión de sustitución de proceso, solo el proceso sustituido se ejecuta en una subcapa, peroase ejecuta en el ámbito del nivel de shell que se está ejecutando actualmente. Esto tiene implicaciones importantes para el alcance de las variables establecidas ena