Soy consciente de la utilidad source
(también conocida como .
), que tomará el contenido de un archivo y lo ejecutará dentro del shell actual.
Ahora, estoy transformando texto en comandos de shell y luego ejecutándolos, de la siguiente manera:
$ ls | sed ... | sh
ls
es solo un ejemplo aleatorio, el texto original puede ser cualquier cosa. sed
también, solo un ejemplo para transformar texto. Lo interesante es sh
. Canalizo lo que sea que llegue sh
y lo ejecuta.
Mi problema es que eso significa iniciar un nuevo sub shell. Prefiero que los comandos se ejecuten dentro de mi shell actual. Como podría hacer con source some-file
, si tuviera los comandos en un archivo de texto.
No quiero crear un archivo temporal porque se siente sucio.
Alternativamente, me gustaría iniciar mi sub shell con exactamente las mismas características que mi shell actual.
actualizar
Ok, las soluciones que usan comillas invertidas ciertamente funcionan, pero a menudo necesito hacer esto mientras reviso y cambio la salida, así que preferiría si hubiera una manera de canalizar el resultado a algo al final.
triste actualización
Ah, la /dev/stdin
cosa se veía tan bonita, pero, en un caso más complejo, no funcionó.
Entonces, tengo esto:
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin
Lo que garantiza que todos los .doc
archivos tengan su extensión en minúsculas.
Y que, dicho sea de paso, se puede manejar xargs
, pero eso es más allá del punto.
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
Entonces, cuando ejecuto el primero, saldrá de inmediato, no pasa nada.