Como posso executar o seguinte comando com chaves no bash?

4

Eu sou um script bash que tenho o seguinte

CMD="{ head -n1 $DATE.$FROMSTRAT.new && egrep -i \"$SYMS\" $DATE.$FROMSTRAT.new; } > $DATE.$TOSTRAT.new" 
echo "Running $CMD"                                                                                     
'$CMD'                                                                                                  

Quando eu chamo o script

Running { head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new
script.sh: line 17: {: command not found 

Mas quando executo { head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new na linha de comando, tudo funciona bem.

Eu tento escapar do { sem sucesso, como posso fazer isso?

    
por statquant 14.09.2016 / 11:47

2 respostas

8

Bem, se você usar uma variável na linha de comando como essa, ela será dividida em palavras, mas isso acontece depois de itens sintáticos como { (ou if ) serem analisados. Então, se você quiser, terá que usar eval

CMD="{ echo blah ; echo bleh; } > output"
eval "$CMD"
# output contains "blah" and "bleh"

Embora note eval execute tudo na variável no shell atual, incluindo atribuições a variáveis (alterar IFS pode ter efeitos engraçados para o restante do script, por exemplo). Você poderia executá-lo em um shell separado com bash -c "$CMD" para atenuar pelo menos o problema de atribuição de variável.

Observe também que os backticks são usados para capturar a saída de um comando e usá-lo na linha de comando, portanto, isso executaria a saída de $CMD também como um comando:

$ CMD="echo foo"
$ '$CMD'
-bash: foo: command not found

Se você está redirecionando a saída para um arquivo, não importa, mas provavelmente você também não precisa.

    
por 14.09.2016 / 12:03
3

tente

function exec_cmd() {
    printf "+ %s \n\n" "$1"
    bash -c "$1" || exit 1
}

exec_cmd '{ head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new' 

Então você não precisa se preocupar em escapar das cordas.
Nota sobre bash -c <command> usage, o próximo argumento depois que <command> é usado como $0 (o "nome" do script dentro do script), e os argumentos subsequentes se tornam os parâmetros posicionais ($ 1, $ 2, etc.). p>     

por 14.09.2016 / 11:59