Je connais bien l' utilitaire source(aka .), qui prendra le contenu d'un fichier et l'exécutera dans le shell actuel.
Maintenant, je transforme du texte en commandes shell, puis je les exécute, comme suit:
$ ls | sed ... | sh
lsest juste un exemple aléatoire, le texte original peut être n'importe quoi. sedaussi, juste un exemple pour transformer du texte. Le peu intéressant est sh. Je pipe tout ce que je suis arrivé shet il le fait fonctionner.
Mon problème est que cela signifie démarrer un nouveau sous-shell. Je préfère 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 de fichier temporaire car je me sens sale.
Sinon, j'aimerais démarrer mon sous-shell avec exactement les mêmes caractéristiques que mon shell actuel.
mise à jour
Ok, les solutions utilisant le backtick fonctionnent certainement, mais je dois souvent le faire pendant que je vérifie et modifie la sortie, donc je préférerais de loin s'il y avait un moyen de canaliser le résultat dans quelque chose à la fin.
triste mise à jour
Ah, la /dev/stdinchose avait l'air si jolie, mais, dans un cas plus complexe, cela n'a pas fonctionné.
Donc, j'ai 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 .docfichiers ont leur extension en minuscule.
Et qui, d'ailleurs, peut être manipulé xargs, mais ce n'est pas le problème.
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
Donc, quand je lance le premier, il se termine tout de suite, rien ne se passe.