eval usado com o comando canalizado

3

Eu tenho file.txt com o comando armazenado em uma linha (este comando é válido quando rodando no console) e eu quero executá-lo em uma linha com sh like

cat file.txt | eval

o que está faltando? algum protótipo?

e se eu tiver arquivo com muitos comandos (um para cada linha) e eu quero executar apenas um comando (uma linha inteira)? minha primeira ideia é:

head -n5 | tail -n1 | eval
    
por quester 21.06.2014 / 15:25

2 respostas

12

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)
    
por 21.06.2014 / 15:32
1

então ... uma solução para sua pergunta é 100% possível e (no contexto de make ) importante.

Eu corri para isso com um makefile, e dada a dificuldade de aninhar comandos bash em um makefile que já usa $(...) para chamar variáveis, é bom poder fazer exatamente o que você está perguntando.

Em vez de usar eval , use apenas o comando de sistema awk ou perl :

// command_list.sh:
echo "1"
echo "2"
echo "3"

// command line prompt:
$: cat command_list.sh | awk '{system($0)}'
1
2 
3

E, construção de comandos:

// a readable version--rather than building up an awk miniprogram, 
// split into logical blocks:

$: cat inputs.txt | awk '{print "building "$1" command "$2" here "}' | awk '{system($0)}' 
    
por 06.06.2018 / 16:42

Tags