command `< file`
passerà il contenuto del file al comando su stdin, ma eliminerà le nuove righe, il che significa che non è possibile scorrere singolarmente ogni riga. Per questo puoi scrivere uno script con un ciclo 'for':
for line in `cat input_file`; do some_command "$line"; done
Oppure (la variante multilinea):
for line in `cat input_file`
do
some_command "$line"
done
Oppure (variante multilinea con $()
invece di ``
):
for line in $(cat input_file)
do
some_command "$line"
done
Riferimenti:
- Sintassi del ciclo For:https://www.cyberciti.biz/faq/bash-for-loop/
Come già accennato, puoi usare i backtick o $(cat filename)
.
Ciò che non è stato menzionato, e penso sia importante notare, è che devi ricordare che la shell spezzerà il contenuto di quel file in base agli spazi bianchi, dando ogni "parola" che trova al tuo comando come argomento. E mentre potresti essere in grado di racchiudere un argomento della riga di comando tra virgolette in modo che possa contenere spazi bianchi, sequenze di escape, ecc., la lettura dal file non farà la stessa cosa. Ad esempio, se il tuo file contiene:
a "b c" d
gli argomenti che otterrai sono:
a
"b
c"
d
Se vuoi estrarre ogni riga come argomento, usa il costrutto while/read/do:
while read i ; do command_name $i ; done < filename
Puoi farlo usando i backtick:
echo World > file.txt
echo Hello `cat file.txt`
Se la tua shell è bash (tra le altre), una scorciatoia per $(cat afile)
è $(< afile)
, quindi dovresti scrivere:
mycommand "$(< file.txt)"
Documentato nella pagina man di bash nella sezione 'Sostituzione dei comandi'.
In alternativa, fai leggere il tuo comando da stdin, quindi:mycommand < file.txt