Wie zum ausführen von script-Befehle von Variablen?
Ich habe versucht zu laufen, Befehle mit pipes.
Basic:
single="ls -l"
$single
die funktioniert wie erwartet
Rohre:
multi="ls -l | grep e"
$multi
ls: |: No such file or directory
ls: grep: No such file or directory
ls: e: No such file or directory
...kein Wunder
bash < $multi
$multi: ambiguous redirect
nächsten versuchen
bash $multi
/bin/ls: /bin/ls: cannot execute binary file
Nur
echo $multi > tmp.sh
bash tmp.sh
gearbeitet.
Gibt es eine Möglichkeit zur Ausführung komplexer Befehle ohne die Erstellung eines Skripts für die Ausführung?
- Siehe BashFAQ/050.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie demonstriert den Unterschied zwischen der shell und kernel.
"ls -l" ist die ausführbare Datei vom system-Aufruf von execve (). Sie können
man execve
für details, aber das ist wohl zu viel detail für Sie."ls -l | grep-e" braucht shell-interpretation zum einrichten der pipe. Ohne eine shell, die Zeichen '|' ist soeben in execve() als argument für ls. Dies ist, warum Sie sehen, die "No such file or directory" - Fehler.
Lösung:
Benötigen Sie eine
heredoc
, diese richtig zu tun. In Antwort auf POSIX-konformen Weg, um zu sehen, ob eine Funktion definiert ist, in einem sh-script ich detailliert, wie zu Lesen ein Skript in einer Variablen programmgesteuert analysiert werden, um Informationen und/oder ändern Sie es als notwendig, dann führen Sie es aus einem anderen script oder eine shell-Funktion. Das ist im Grunde, was Sie zu tun versuchen, und dieheredoc
macht es möglich, denn es bietet einen Datei-Deskriptor:Das wäre zu lösen, Ihre einfachen Beispiel der Fall. Siehe meine andere Antwort mehr.
-Mike
wenn Sie möchten, um Befehle mit pipes, führen Sie es einfach. Nicht immer setzen Sie den Befehl in eine variable und versuchen, Sie auszuführen. Führen Sie einfach es
ls -l |grep
Wenn Sie möchten, erfassen Sie die Ausgabe mit $()
var=$(ls -l |grep .. )