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


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é .


(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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.