Bash – eval used with piped command

bashpipe

I have file.txt with command stored in one line (this command is valid when running in console) and I want to execute it in one line with sh like

cat file.txt | eval

what is missing? any protips?

and what if I have file with many commands (one for each line) and I want to execute only one command (one whole line)?
my first idea is:

head -n5 | tail -n1 | eval

Best Answer

eval does not read its command string from stdin.

eval "$(cat file.txt)"
# or easier, in ksh/bash/zsh
eval "$(<file.txt)"
# usually you cannot be sure that a command ends at the end of line 5
eval "$(head -n 5 file.txt)"

Instead of eval you can use standard . or bash/zsh/ksh source if the commands are in a file anyway:

source ./file

(note that it's important to add that ./. Otherwise source looks for file in $PATH before considering the file in the current directory. If in POSIX mode, bash would not even consider the file in the current directory, even if not found in $PATH).

That does not work with choosing a part of the file, of course. That could be done by:

head -n 5 file.txt >commands.tmp
source ./commands.tmp

Or (with ksh93, zsh, bash):

source <(head -n 5 file.txt)
Related Question