Quiero llenar una variable con una línea de comando leída de un archivo y ejecutarla. No hay problema cuando se trata de un solo comando. Cuando uso un |, no funciona. Alguna ayuda ??? Gracias
$ 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
Respuesta1
El problema es que la tubería ( |
) es un comando "meta" ejecutado por el shell y conecta dos comandos diferentes. También lo ls -1 | tail -1
es ejecutar dos comandos ( ls
y tail
) y utilizar una construcción de shell ( |
) para conectarse a dos. (Entonces tu títuloacomando dentro de una variablees incorrecto, ya que su problema es realmentemúltiplecomandos dentro de unsolterovariable)
De todos modos, la solución es analizar/ejecutar su comando con el shell:
f="ls -1 | tail -1"
sh -c "${f}"
Alternativamente, también puedes usar eval
, que funciona sin bifurcar un nuevo proceso de shell:
f="ls -1 | tail -1"
eval "${f}"
Respuesta2
puede utilizar una función como se muestra a continuación;
f() { ls -1 | tail -1; }
P.ej;
user@host $ f() { ls -1 | tail -1; }
user@host $ f
test.txt