111 votes

Comment exécuter la sortie d'une commande dans l'interpréteur de commandes actuel ?

Je suis bien conscient de la source (alias . ), qui prend le contenu d'un fichier et l'exécute dans l'interpréteur de commandes actuel.

Maintenant, je transforme du texte en commandes shell, puis je les exécute, comme suit :

$ ls | sed ... | sh

ls n'est qu'un exemple aléatoire, le texte original peut être n'importe quoi. sed également, juste un exemple de transformation de texte. La partie intéressante est sh . Je pipe tout ce que j'ai à sh et il l'exécute.

Le problème, c'est que cela signifie qu'il faut créer un nouveau sous-ensemble. Je préférerais que les commandes soient exécutées dans mon shell actuel. Comme je pourrais le faire avec source some-file si j'avais les commandes dans un fichier texte.

Je ne veux pas créer un fichier temporaire car cela me semble sale.

Par ailleurs, j'aimerais démarrer mon sous-shell avec les mêmes caractéristiques que mon shell actuel.

mise à jour

Ok, les solutions utilisant le backtick fonctionnent certainement, mais j'ai souvent besoin de le faire pendant que je vérifie et modifie la sortie, donc je préférerais qu'il y ait un moyen d'intégrer le résultat dans quelque chose à la fin.

triste mise à jour

Ah, les /dev/stdin La chose était si belle, mais, dans un cas plus complexe, elle n'a pas fonctionné.

J'ai donc ceci :

find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin

Ce qui garantit que tous les .doc ont leur extension en minuscules.

Et qui, soit dit en passant, peut être traité avec xargs mais ce n'est pas la question.

find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv

Ainsi, lorsque j'exécute le premier, il se termine immédiatement, rien ne se passe.

7voto

Geoff Nixon Points 146

Je pense que c'est la "bonne réponse" à la question :

ls | sed ... | while read line; do $line; done

En d'autres termes, il est possible d'introduire un tuyau dans un while boucle ; le read La commande prend une ligne de son stdin et l'affecte à la variable $line . $line devient alors la commande exécutée dans la boucle ; et elle continue jusqu'à ce qu'il n'y ait plus de lignes dans son entrée.

Cela ne fonctionnera toujours pas avec certaines structures de contrôle (comme une autre boucle), mais cela convient dans ce cas.

2voto

ish-west Points 81

Pour utiliser la solution de mark4o sur bash 3.2 (macos), une chaîne here peut être utilisée à la place des pipelines comme dans cet exemple :

. /dev/stdin <<< "$(grep '^alias' ~/.profile)"

1voto

Eric Wendelin Points 13805

Je pense que votre solution est la substitution de commande avec des backticks : http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html

Voir section 3.4.5

0voto

Kaleb Pederson Points 22428

Pourquoi ne pas utiliser source alors ?

$ ls | sed ... > out.sh ; source out.sh

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X