ein Befehl innerhalb einer Variablen

ein Befehl innerhalb einer Variablen

Ich möchte eine Variable mit einer aus einer Datei gelesenen Befehlszeile füllen und ausführen. Kein Problem, wenn es sich um einen einzelnen Befehl handelt. Wenn ich ein | verwende, funktioniert es nicht. Irgendwelche Hilfe??? Danke

$ 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

Antwort1

Das Problem ist, dass die Pipe ( |) ein „Meta“-Befehl ist, der von der Shell ausgeführt wird und zwei verschiedene Befehle verbindet. Dasselbe ls -1 | tail -1gilt für die Ausführung von zwei Befehlen ( lsund tail) und die Verwendung einer Shell-Konstruktion ( |), um die beiden zu verbinden. (Ihr Titel lautet alsoABefehl innerhalb einer Variablenist falsch, da Ihr Problem wirklich istmehrereBefehle innerhalb eineseinzelVariable)

Die Lösung besteht jedenfalls darin, Ihren Befehl mit der Shell zu analysieren/auszuführen:

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

Alternativ können Sie auch verwenden eval, was ohne Aufspalten eines neuen Shell-Prozesses funktioniert:

f="ls -1 | tail -1"
eval "${f}"

Antwort2

Sie können eine Funktion wie unten verwenden;

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

Z.B;

user@host $ f() { ls -1 | tail -1; }
user@host $ f
test.txt

verwandte Informationen