86 votos

Cómo ejecutar la salida de un comando en el shell actual?

Soy muy consciente de la source (aka .) de la utilidad, que tendrá el contenido de un archivo y ejecutar dentro de la shell actual.

Ahora, yo soy la transformación de un texto en el shell de comandos y, a continuación, ejecutar, como sigue:

$ ls | sed ... | sh

ls es sólo un ejemplo al azar, el texto original puede ser cualquier cosa. sed demasiado, sólo un ejemplo de transformación de texto. La parte interesante es sh. Yo tubería de lo que llegué a sh y corre.

Mi problema es, que supone el inicio de una nueva sub shell. Prefiero tener los comandos se ejecutan dentro de mi concha. Como me gustaría ser capaz de hacer con source some-file, si tuviera los comandos en un archivo de texto.

No quiero crear un archivo temporal porque se siente sucio.

Como alternativa, me gustaría comenzar mi sub shell con las mismas características como la actual de mi concha.

actualización

Ok, las soluciones utilizando el acento grave sin duda el trabajo, pero a menudo se necesita hacer esto mientras estoy revisando y cambiando la salida, así que me gusta mucho más que si hubiera una manera de canalizar el resultado en algo en el final.

triste actualización

Ah, /dev/stdin cosa se veía tan bonita, pero, en un caso más complejo, no funcionó.

Por lo tanto, tengo esto:

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

Que asegura que todas las .doc archivos tienen la extensión convertidas a minúsculas.

Y que por cierto, pueden ser manejados con xargs, pero que es además el punto.

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

Así que, cuando me quedo a la primera, voy a salir de inmediato, no pasa nada.

126voto

Juliano Puntos 13802

El eval comando existe para este mismo propósito.

eval $( ls | sed... )

Más del manual de bash:

eval

          eval [arguments]

Los argumentos son concatenados en un solo comando, que se lee y ejecuta, y su estado de salida se devuelve como salida estado de eval. Si no hay argumentos o sólo vacíos argumentos, el el estado de retorno es cero.

82voto

mark4o Puntos 20472
$ ls | sed ... | source /dev/stdin

ACTUALIZACIÓN: Esto funciona en bash 4.0, así como tcsh, y el guión (si cambio source a .). Al parecer, este fue buggy en bash 3.2. Desde el bash 4.0 notas de la versión:

Corregido un error que causaba `.' a no leer y ejecutar los comandos de los archivos no regulares, tales como los dispositivos o canalizaciones con nombre.

36voto

cluracan Puntos 1812

Wow, yo sé que es una pregunta vieja, pero me he encontrado con el mismo problema exacto recientemente (que cómo llegué aquí).

De todos modos - no me gusta la source /dev/stdin respuesta, pero creo que he encontrado uno mejor. Es engañosamente simple en realidad:

echo ls -la | xargs xargs

Bonito, ¿verdad? En realidad, esto no hace lo que quiere, porque si usted tiene varias líneas que se concat ellos en un solo comando en lugar de ejecutar cada comando por separado. Así que la solución que he encontrado es:

ls | ... | xargs -L 1 xargs

el -L 1 opción significa que usted utilice (en la mayoría) 1 línea por la ejecución del comando. Nota: si la línea termina con un espacio al final, va a ser concatenados con la siguiente línea! Así que asegúrese de que cada línea termina con un no-espacio.

Por último, se puede hacer

ls | ... | xargs -L 1 xargs -t

a ver qué comandos son ejecutados (-t es detallado).

Espero que alguien lea esto!

5voto

chaos Puntos 69029
`ls | sed ...`

En cierto modo me siento como ls | sed ... | source - sería más bonito, pero lamentablemente source no entiende - a significar stdin.

1voto

Eric Wendelin Puntos 13805

Yo creo que tu solución es la sustitución de comandos con comillas simples inclinadas: http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html

Consulte la sección 3.4.5

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X