Passing an argument to multiple commands in a single line
You can define a local variable for this:
f=file; commandA $f && commandB $f && ...
You can also execute all unconditionally (replacing &&
with ;
) or in parallel (replacing &&
with &
).
Alternatively, you can also use shell history expansion to reference previous arguments:
commandA file && commandB !:1 && ...
For shells such as Bash, Korn and Z that have process substitution, you can do this:
find file | tee >(xargs commandA) >(xargs commandB) >(xargs perl -ne '...')
You can use xargs to construct a command line e.g.:
echo file | xargs -i -- echo ls -l {}\; wc -l {}
Just pipe the above into bash to run it:
echo file | xargs -i -- echo ls -l {}\; wc -l {} | bash
Extending the example to all the *.c files in the current directory (escaping the ls here to prevent any shell alias substitution):
\ls -1 *.c | xargs -i -- echo ls -l {}\; wc -l {} | bash