J'ai une commande de pré-processus pour sortir un fichier
./preprocess.sh > preprocessed_file
et le preprocessed_file
sera utilisé comme ça
while read line
do
./research.sh $line &
done < preprocessed_file
rm -f preprocessed_file
Existe-t-il un moyen de diriger la sortie vers la while read line
pièce au lieu de la sortir vers le fichier préprocédé? Je pense qu'il devrait y avoir un meilleur moyen que d'utiliser ce temp preprocessed_file
.
shell
io-redirection
Marcus Thornton
la source
la source
<
est une redirection, tandis que la<(...)
syntaxe de substitution de processus. Vous devriez lire: gnu.org/software/bash/manual/html_node/… pour plus de détails.<(...)
fait partie de la syntaxe.read
doit lire un octet à la fois, alors qu'il peut optimiser les choses avec la lecture de gros morceaux et rechercher en arrière lors de la lecture à partir d'un fichier normal. Le mieux est d'éviter leswhile read
boucles en premier lieu lorsque cela est possible. Notez également que vous devezIFS= read -r line
lire la ligne$line
. Et laisser sans$line
guillemets (invoquer l'opérateur split + glob) ici n'a probablement aucun sens.read
shell intégré lit un caractère à la fois lors de la lecture à partir d'un tuyau (indépendamment de ce qui est à l'autre extrémité du tuyau quiread
n'a aucun moyen de savoir), ce qui est l'une des raisons pour lesquelles leswhile read
boucles sont extrêmement lentes.Oui! Vous pouvez utiliser un tuyau de processus
|
.Un tube de processus transmet la sortie standard (
stdout
) d'un processus à l'entrée standard (stdin
) du suivant.Vous pouvez éventuellement mettre un caractère de nouvelle ligne après un
|
et étendre la commande à la ligne suivante.Remarque:
a|b
est équivalent àb < <(a)
, mais sans les fichiers magiques, et dans un ordre plus lisible, en particulier lorsque le pipeline s'allonge.a|b|c
est équivalent àc < <(b < <(a))
et
a|b|c|d|e
este < < (d < <(c < <(b < <(a))))
la source
$line
entre guillemets doubles (par exemple, dans votre script,./research.sh "$line" &
).research.sh
fonctionne avec le tableau d'arguments de ligne de commande et$line
est, par exemple, "un deux", avec l'intention que le premier argument soit "un" et le deuxième argument "deux", la citation$line
rendra cela impossible - à la place le premier argument sera "un deux" et il n'y en aura pas un deuxième ...a|b
équivaut àb < <(a)
" - proche, mais pas tout à fait. Dans la version de canal, les deux côtés du canal sont exécutés en sous-shell, tandis que dans la version de substitution de processus, seul le processus substitué est exécuté dans un sous-shell, maisa
est exécuté dans le cadre du niveau de shell en cours d'exécution. Cela a des implications importantes pour la portée des variables définies dansa