Read file lines into shell line separated by space
You can use xargs
, with the delimiter set to newline (\n
): this will ensure the arguments get passed correctly even if they contain whitespace:
xargs -rd'\n' command < requirements.txt
From man page:
-r
,--no-run-if-empty
If the standard input does not contain any nonblanks, do not run the command. Normally, the command is run once even if there is no input. This option is a GNU extension.
--delimiter=delim
,-d delim
Input items are terminated by the specified character.
You can simply use bash
redirection and command substitution to get the file contents as arguments to your command:
command $(<file)
This works because not only space is a valid word splitting character, but newline as well – you don’t need to substitute anything. However, in the case of many lines you will get an error referring to the shell’s ARG_MAX
limit (as you will with substitution solutions). Use printf
to built a list of arguments and xargs
to built command lines from it to work around that:
printf "%s\0" $(<file) | xargs -0 command
Note that neither of these approaches work for lines containing whitespace
or globbing characters (besides the newline of course) – fortunately package names don’t (AFAIK). If you have whitespace or globbing characters in the lines use either xargs
(see this answer) or parallel
(see this answer).
Use tr
and bash substitution:
command $(tr '\n' ' ' < requirements.txt)
for example:
echo $(tr '\n' ' ' < requirements.txt)
output would be:
package1 package2 package3
or:
sudo apt install -y $(tr '\n' ' ' < requirements.txt)
would install all packages.