um comando dentro de uma variável

0

Eu quero preencher uma variável com uma linha commnad lida de um arquivo e executá-la. Não há problema quando é um único comando. Quando eu uso um |, não funciona. Qualquer ajuda ??? Obrigado

$ f="ls -1"
$ $f
a
a0
a1
a2
a3
b1
cfg
cfile
dfile
e
fcorreo.txt
log
logs
work
$ f="ls -1 | tail -1"
$ $f
ls: cannot access |: No such file or directory
ls: cannot access tail: No such file or directory
$ f='ls -1 | tail -1'
$ $f
ls: cannot access |: No such file or directory
ls: cannot access tail: No such file or directory
$ echo $f
ls -1 | tail -1
    
por teje 25.10.2016 / 14:07

2 respostas

1

você pode usar uma função como abaixo:

f() { ls -1 | tail -1; } 

Por exemplo:

user@host $ f() { ls -1 | tail -1; }
user@host $ f
test.txt
    
por 25.10.2016 / 14:15
2

O problema é que o pipe ( | ) é um comando "meta" executado pelo shell e conecta dois comandos diferentes. Portanto, ls -1 | tail -1 está executando dois comandos ( ls e tail ) e usa uma construção de shell ( | ) para se conectar a dois. (então o seu comando a dentro de uma variável está incorreto, pois o seu problema é realmente vários comandos dentro de um single variável )

De qualquer forma, a solução é analisar / exec seu comando com o shell:

f="ls -1 | tail -1"
sh -c "${f}"

Como alternativa, você também pode usar eval , que funciona sem um novo processo de shell:

f="ls -1 | tail -1"
eval "${f}"
    
por 25.10.2016 / 14:39

Tags