command `< file`
transmettra le contenu du fichier à la commande sur stdin, mais supprimera les retours à la ligne, ce qui signifie que vous ne pourrez pas parcourir chaque ligne individuellement. Pour cela, vous pouvez écrire un script avec une boucle 'for' :
for line in `cat input_file`; do some_command "$line"; done
Ou (la variante multiligne) :
for line in `cat input_file`
do
some_command "$line"
done
Ou (variante multiligne avec $()
au lieu de ``
):
for line in $(cat input_file)
do
some_command "$line"
done
Références :
- Syntaxe de la boucle For :https://www.cyberciti.biz/faq/bash-for-loop/
Comme déjà mentionné, vous pouvez utiliser les backticks ou $(cat filename)
.
Ce qui n'a pas été mentionné, et je pense qu'il est important de le noter, c'est que vous devez vous rappeler que le shell divisera le contenu de ce fichier en fonction des espaces, en donnant chaque "mot" qu'il trouve à votre commande comme argument. Et même si vous pouvez mettre un argument de ligne de commande entre guillemets afin qu'il puisse contenir des espaces, des séquences d'échappement, etc., la lecture du fichier ne fera pas la même chose. Par exemple, si votre fichier contient :
a "b c" d
les arguments que vous obtiendrez sont :
a
"b
c"
d
Si vous voulez extraire chaque ligne comme argument, utilisez la construction while/read/do :
while read i ; do command_name $i ; done < filename
Vous faites cela en utilisant des backticks :
echo World > file.txt
echo Hello `cat file.txt`
Si votre shell est bash (entre autres), un raccourci pour $(cat afile)
est $(< afile)
, vous écririez donc :
mycommand "$(< file.txt)"
Documenté dans la page de manuel de bash dans la section « Substitution de commandes ».
Alternativement, faites lire votre commande à partir de stdin, donc :mycommand < file.txt