2011-10-26 26 views
19

Tengo un comando de shell. Me gustaría escribir el resultado en la salida estándar y guardarlo en variable también. Me gustaría resolverlo con un solo comando. He intentado estas cosas.redirigir salida de comando a salida variable y estándar en ksh

ls > $VAR   # redirects the output to file which name is stored in $VAR 
ls | tee -a $VAR # writes to standard output as well as in file which name is stored in $VAR 
VAR=`ls`   # output into $VAR, but it is not sent to standard output 
VAR=`ls`;echo $VAR # ok, it works but these are two commands 

¿Alguna idea?

+0

Solo curiosidad por la limitación de 1 línea. eso me hace pensar que no eres la raíz, sino también un usuario del objetivo del sistema. No puedo entender por qué tienes esa limitación. De todos modos, te he publicado una respuesta "doyourself". – erm3nda

Respuesta

46

¿Qué tal:

VAR=$(ls | tee /dev/tty) 
+1

Funciona, muchas gracias. –

+0

Dependiendo de su sistema operativo, 'var = $ (ls | tee/proc/$$/fd/1)' podría funcionar también. –

+0

Incluso si esto funciona perfectamente, le publico un ejemplo de "hágalo usted mismo". Im a Linux/bash noob, pero me gusta aprender esos consejos: D – erm3nda

3

gran respuesta de @Gary_Barker, pero esto no es posible en todos los sistemas.

En nuestro teamcity no hay una char-console. Y hay otro pequeño problema.

Si uso

VAR=$(ls -1); echo $VAR

que no es lo mismo como ls -1

Mi solución funciona, si es que no importa, que la salida proviene de la tubería de error.

VAR=$(ls -1 | tee >&2)

+0

Asegúrate de hacer una cita doble del eco si el resultado es más de una línea. 'VAR = $ (ls -1); echo "$ VAR" '. de lo contrario, se aplasta en una sola línea – hoss

+0

@hoss ¿Puedes explicar por qué sucede esto? –

0

como yo lo entiendo, VAR=`ls`;echo $VAR está bien, pero no te gusta porque tiene 2 comandos en ella.

Mientras @ Gary-Barker está funcionando, no he verificado todos los sistemas. Si tienes un problema con el tee u otro, puedes construir tu propio SIEMPRE.

No sé si lo sabes, pero muchos de los programas que puedes usar en Linux son solo un montón de código que usa los pequeños binarys en el sistema. Si bien esto es cierto, no tiene sentido usar 1 o 2 comandos, porque la ejecución final es realmente un grupo de pequeños.

Entonces, si su problema real es que solo puede escribir un solo comando en su destino, puede escribir su propia "aplicación", haciendo un script sh en la carpeta/sbin y dejándolo sin la extensión .sh (porque estos se excecuted con ./ o prefijo sh y no por su nombre)

me escribió que, como ejemplo:

#!/bin/bash if [ $1 ] then VAR=$*; echo $VAR fi

Para este ejemplo tengo hacer que el archivo/sbin/varrun. Lo he intentado con los comandos folling con éxito la salida (normal):

  • varrun ls
  • varrun uname
  • varrun uname -a

en cuenta que no he utilizado "comillas" sobre los comandos con espacios.

Cuestiones relacionadas