Ubuntu: exécuter la sortie d'une autre commande

13

J'ai une ligne de commande qui génère une ligne de commande différente, par exemple:

> commandlineA param1 param2
  commandlineB param1

Je voudrais avoir une seule exécution en ligne de commande qui exécutera commandlineB avec le ou les paramètres donnés.

Existe-t-il un moyen simple de le faire à l'aide d'une seule ligne de commande ou dois-je exécuter un petit fichier bash qui stockera la sortie dans une variable, puis l'exécutera?

Merci

Lior Ohana
la source
2
J'ai cherché pendant un bon moment mais je suppose que j'ai dû poster une question pour trouver par moi-même .... $ (commandlineA param1 param2) a fait le travail.
Lior Ohana

Réponses:

17

Vous semblez avoir réglé cela vous-même, mais vous pouvez utiliser:

$(command parameter1 parameter2)

Edit of edit: ce qui suit est quelque peu faux, alors qu'il exécute la commande dans un sous-shell, il s'avère que les variables d'environnement seront toujours disponibles. Désolé d'avoir induit les gens en erreur ...

Edit: qui s'exécutera dans un sous-shell, aucune variable d'environnement non exportée ne sera utilisée. Si vous souhaitez exécuter une commande dans le même shell, vous devez utiliser:

eval $(command parameter1 parameter2)

Une autre réponse donnée est de passer par bash lui-même:

echo 'uname -a' | bash 

Cela s'exécutera également dans un sous-shell, pour fonctionner dans le même shell dont vous aurez besoin:

echo 'uname -a' | bash -c

Par ailleurs, vous pouvez également utiliser des ticks arrière au lieu de la syntaxe $ (), mais ce n'est pas recommandé .

Chris Sherlock
la source
(1) Je ne sais pas exactement ce que vous entendez par «qui se déroulera en sous-couche». Des variables d'environnement non exportées seront utilisées. (2) Je ne vois aucune raison de l'utiliser evalici. Si vous avez une raison, veuillez l'expliquer. (3) Votre dernier exemple (avec  -c) est totalement faux.
Scott
Vous avez raison, j'ai vérifié à nouveau et je me suis trompé. Lors de l'exécution en tant que liste, les fourches du shell bash et les variables d'environnement sont toujours disponibles. Vous avez donc raison, désolé.
Chris Sherlock
4

Utilisez ceci:

commandlineA param1 param2 | bash

Exemple:

echo "uname -a" | bash

Production:

Linux k1104 2.6.38-8-generic # 42-Ubuntu SMP lun 11 avril 03:31:50 UTC 2011 i686 i686 i386 GNU / Linux
Cyrus
la source
Il n'y a rien de mal à cela, mais cela engendrera un autre shell bash.
Chris Sherlock
Il en sera de même$(commandlineA param1 param2)
tripleee le
@tripleee: vous comparez des oranges et des citrouilles.  printf '\143\144\040\057\n' | bashest finalement un no-op, car la commande est exécutée dans un nouveau processus shell séparé (et transitoire). En revanche, $(printf '\143\144\040\057\n')le shell actuel, actif et interactif changera de répertoire.
Scott