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
ls
est juste un exemple aléatoire, le texte original peut être n'importe quoi. sed
aussi, juste un exemple pour transformer du texte. Le peu intéressant est sh
. Je pipe tout ce que je suis arrivé sh
et 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/stdin
chose 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 .doc
fichiers 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.