Ubuntu: Führen Sie die Ausgabe eines anderen Befehls aus

13

Ich habe eine Befehlszeile, die eine andere Befehlszeile ausgibt, zum Beispiel:

> commandlineA param1 param2
  commandlineB param1

Ich möchte eine einzelne Befehlszeilenausführung haben, die Befehlszeile B mit den angegebenen Parametern ausführt.

Gibt es eine einfache Möglichkeit, dies über eine einzige Befehlszeile zu tun, oder muss ich eine kleine Bash-Datei ausführen, in der die Ausgabe in einer Variablen gespeichert und dann ausgeführt wird?

Vielen Dank

Lior Ohana
quelle
2
Ich habe eine ganze Weile gesucht, aber ich musste wohl eine Frage stellen, um sie selbst zu finden ... $ (commandlineA param1 param2) hat den Job gemacht.
Lior Ohana

Antworten:

17

Sie scheinen dies selbst herausgefunden zu haben, aber Sie können Folgendes verwenden:

$(command parameter1 parameter2)

Bearbeiten oder Bearbeiten: Das Folgende ist etwas falsch, obwohl der Befehl in einer Subshell ausgeführt wird, stellt sich heraus, dass die Umgebungsvariablen weiterhin verfügbar sind. Entschuldigung für die irreführenden Leute ...

Bearbeiten: Das wird in einer Subshell ausgeführt, nicht exportierte Umgebungsvariablen werden nicht verwendet. Wenn Sie einen Befehl in derselben Shell ausführen möchten, müssen Sie Folgendes verwenden:

eval $(command parameter1 parameter2)

Eine andere Antwort ist, durch Bash selbst zu pfeifen:

echo 'uname -a' | bash 

Dies wird auch in einer Subshell ausgeführt, um in derselben Shell ausgeführt zu werden, die Sie benötigen:

echo 'uname -a' | bash -c

Im Übrigen können Sie anstelle der $ () -Syntax auch Back-Ticks verwenden, dies wird jedoch nicht empfohlen .

Chris Sherlock
quelle
(1) Ich weiß nicht genau, was Sie unter "das läuft in einer Unterschale" verstehen. Unexported Umgebungsvariablen werden verwendet werden. (2) Ich sehe keinen Grund, evalhier zu verwenden . Wenn Sie einen Grund haben, erklären Sie ihn bitte. (3) Ihr letztes Beispiel (mit  -c) ist völlig falsch.
Scott
Sie haben Recht, ich habe noch einmal nachgesehen und mich dort geirrt. Bei der Ausführung als Liste sind die Bash-Shell-Gabeln und die Umgebungsvariablen weiterhin verfügbar. Sie haben also Recht, tut mir leid.
Chris Sherlock
4

Benutze das:

commandlineA param1 param2 | bash

Beispiel:

echo "uname -a" | bash

Ausgabe:

Linux k1104 2.6.38-8-generic # 42-Ubuntu SMP Mo 11. April 03:31:50 UTC 2011 i686 i686 i386 GNU / Linux
Cyrus
quelle
Daran ist nichts auszusetzen, es wird jedoch eine weitere Bash-Shell erzeugt.
Chris Sherlock
So wird$(commandlineA param1 param2)
Tripleee
@tripleee: Du vergleichst Orangen und Kürbisse.  printf '\143\144\040\057\n' | bashist letztendlich ein No-Op, da der Befehl in einem neuen, separaten (und vorübergehenden) Shell-Prozess ausgeführt wird. Im Gegensatz dazu wechselt $(printf '\143\144\040\057\n')die aktuelle, aktive, interaktive Shell das Verzeichnis.
Scott