Tengo un comando de preproceso para generar un archivo
./preprocess.sh > preprocessed_file
y preprocessed_file
se 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 line
parte 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.read
tiene 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 read
bucles por completo en primer lugar cuando sea posible. También tenga en cuenta que necesitaIFS= read -r line
leer la línea$line
. Y dejar sin$line
comillas (invocando al operador split + glob) aquí probablemente no tiene sentido.read
shell 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 queread
no tiene forma de saber), que es una de las razones por las que loswhile read
bucles 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|b
es 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|c
es equivalente ac < <(b < <(a))
y
a|b|c|d|e
ese < < (d < <(c < <(b < <(a))))
fuente
$line
comillas dobles (por ejemplo, en su secuencia de comandos./research.sh "$line" &
).research.sh
funciona con la matriz de argumentos de la línea de comandos y$line
es, por ejemplo, "uno dos", con la intención de que el primer argumento sea "uno" y el segundo argumento "dos", las citas$line
lo harán imposible; en cambio, el primer argumento será "uno dos" y no habrá un segundo ...a|b
es 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, peroa
se 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