command `< file`
předá obsah souboru příkazu na stdin, ale odstraní nové řádky, což znamená, že nemůžete iterovat každý řádek jednotlivě. K tomu můžete napsat skript se smyčkou 'for':
for line in `cat input_file`; do some_command "$line"; done
Nebo (víceřádková varianta):
for line in `cat input_file`
do
some_command "$line"
done
Nebo (víceřádková varianta s $()
místo ``
):
for line in $(cat input_file)
do
some_command "$line"
done
Odkazy:
- Pro syntaxi smyčky:https://www.cyberciti.biz/faq/bash-for-loop/
Jak již bylo zmíněno, můžete použít backticks nebo $(cat filename)
.
Co nebylo zmíněno, a myslím, že je důležité poznamenat, je, že si musíte pamatovat, že shell rozdělí obsah tohoto souboru podle mezer, přičemž každé nalezené „slovo“ dá vašemu příkazu jako argument. A i když můžete být schopni uzavřít argument příkazového řádku do uvozovek, aby mohl obsahovat mezery, escape sekvence atd., čtení ze souboru neudělá to samé. Pokud váš soubor například obsahuje:
a "b c" d
argumenty, které získáte, jsou:
a
"b
c"
d
Pokud chcete vytáhnout každý řádek jako argument, použijte konstrukci while/read/do:
while read i ; do command_name $i ; done < filename
Uděláte to pomocí zpětných značek:
echo World > file.txt
echo Hello `cat file.txt`
Pokud je váš shell bash (mimo jiné), zkratka pro $(cat afile)
je $(< afile)
, takže byste napsali:
mycommand "$(< file.txt)"
Dokumentováno v manuálové stránce bash v sekci 'Command Substitution'.
Případně nechte svůj příkaz přečíst ze stdin, takže:mycommand < file.txt