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
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
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}"
Tags ksh