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.