Executando comandos armazenados em variáveis do shell

6

O seguinte funciona no meu shell (zsh):

> FOO='ls'
> $FOO
file1 file2

mas o seguinte não:

> FOO='emacs -nw'
> $FOO
zsh: command not found: emacs -nw

mesmo invocando emacs -nw diretamente abre o Emacs perfeitamente bem.

Por quê?

    
por Amelio Vazquez-Reina 28.12.2014 / 21:38

2 respostas

8

Porque não há nenhum comando chamado emacs -nw . Existe um comando chamado emacs para o qual você pode passar a opção -nw .

Para armazenar comandos, você geralmente usa funções :

foo() emacs -nw "$@"
foo ...

Para armazenar vários argumentos, você geralmente usa matrizes:

foo=(emacs -nw)
$foo ...

Para armazenar uma string contendo várias palavras separadas por espaços e dividi-la em espaços, você pode fazer:

foo='emacs -nw'
${(s: :)foo} ...

Você pode confiar na divisão de palavras executada no IFS (o IFS contém espaço, tabulação, nova linha e nul por padrão):

foo='emacs -nw'
$=foo ...
    
por 28.12.2014 / 21:51
2

Para futuros leitores, deve-se mencionar que a maneira "padrão" de fazer isso é eval uate os argumentos armazenados na variável:

eval "$foo"

Também é possível avaliar a expressão com a substituição de comandos:

$(expr "$foo")
A variável

echo ed (ou de outra forma impressa) também funciona:

$(echo "$foo")

Estes métodos funcionam bem, pelo menos em zsh e bash .

    
por 03.01.2015 / 13:30