![um comando dentro de uma variável](https://rvso.com/image/97249/um%20comando%20dentro%20de%20uma%20vari%C3%A1vel.png)
Quero preencher uma variável com uma linha de comando 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
Responder1
O problema é que o pipe ( |
) é um comando "meta" executado pelo shell e conecta dois comandos diferentes. O mesmo ls -1 | tail -1
acontece com a execução de dois comandos ( ls
e tail
) e usa uma construção de shell ( |
) para conectar-se a dois. (então seu títuloacomando dentro de uma variávelestá incorreto, pois seu problema é realmentemúltiplocomandos dentro de umsolteirovariável)
De qualquer forma, a solução é analisar/executar seu comando com o shell:
f="ls -1 | tail -1"
sh -c "${f}"
Alternativamente, você também pode usar eval
, que funciona sem bifurcar um novo processo de shell:
f="ls -1 | tail -1"
eval "${f}"
Responder2
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