xargs
je nejflexibilnější řešení pro rozdělení výstupu na argumenty příkazu.
Je také velmi dobře čitelný a snadno použitelný díky jednoduché parametrizaci.
Formát je xargs -n $NUMLINES mycommand
.
Například do echo
každý jednotlivý řádek v souboru /tmp/tmp.txt
udělali byste:
cat /tmp/tmp.txt | xargs -n 1 echo
Nebo na diff
každý postupný pár souborů uvedený jako řádky v souboru s výše uvedeným názvem byste udělali:
cat /tmp/tmp.txt | xargs -n 2 diff
-n 2
pokyn xargs
konzumovat a předat jako samostatné argumenty dva řádky toho, co jste do něj vložili najednou.
xargs
si můžete přizpůsobit k rozdělení podle oddělovačů kromě konce řádku/nového řádku.
Použijte man xargs
a google, abyste se dozvěděli více o síle tohoto všestranného nástroje.
Nejlepší způsob, jak toho dosáhnout, je přesměrovat soubor do smyčky:
# Basic idea. Keep reading for improvements.
FILE=test
while read CMD; do
echo "$CMD"
done < "$FILE"
Přesměrování s < "$FILE"
má oproti cat "$FILE" | while ...
několik výhod . Vyhne se zbytečnému používání kočky a ušetří zbytečný dětský proces. Vyhne se také běžnému úskalí, kdy smyčka běží v podskořápce. V Bash jsou příkazy v |
potrubí běží v podskořápkách, což znamená, že přiřazení proměnných se po skončení smyčky ztratí. Přesměrování pomocí <
nemá tento problém, takže můžete použít $CMD
za smyčkou nebo upravit jiné proměnné uvnitř smyčky. Také se opět vyhne zbytečným podřízeným procesům.
Je možné provést některá další vylepšení:
- Přidejte
IFS=
takžeread
neořízne úvodní a koncové mezery z každého řádku. - Přidejte
-r
naread
aby se zabránilo interpretaci zpětných lomítek jako únikových sekvencí. - malá písmena
CMD
aFILE
. Bashova konvence je, že pouze proměnné prostředí a vnitřního prostředí jsou velká písmena. - Použijte
printf
místoecho
což je bezpečnější, pokud$cmd
je řetězec jako-n
, což jeecho
bude interpretováno jako vlajka.
file=test
while IFS= read -r cmd; do
printf '%s\n' "$cmd"
done < "$file"
To, co máte, je text "cat test"
do smyčky.
Vy jen chcete:
cat test | \
while read CMD; do
echo $CMD
done