eval não lê sua string de comando de 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)"
Em vez de eval , você pode usar o padrão . ou bash / zsh / ksh source se os comandos estiverem em um arquivo mesmo assim:
source ./file
(note que é importante adicionar ./ . Caso contrário, source procurará file in $PATH antes de considerar o file no diretório atual. Se no modo POSIX, bash não seria nem considere o file no diretório atual, mesmo que não seja encontrado em $PATH ).
Isso não funciona com a escolha de uma parte do arquivo, é claro. Isso pode ser feito por:
head -n 5 file.txt >commands.tmp
source ./commands.tmp
Ou (com ksh93, zsh, bash):
source <(head -n 5 file.txt)