Redirigir la salida a una variable?

9

Me interesa dirigir la salida de dos comandos a una variable. No quiero que la salida se muestre en la pantalla, sino que se asigne a una variable dentro de mi script para que pueda volver a usarla.

lo que estoy haciendo es obtener el tamaño del archivo de un directorio usando los comandos que se ven a continuación:

ls -l /var/spool | wc -c

Este comando me muestra el tamaño del archivo en bytes y muestra la salida como un entero. Estoy interesado en asignar este entero a una variable de mi agrado para poder compararlo con otra variable más adelante

Esto no parece funcionar:

size = ls -l /var/spool | wc -c

¿Funcionaría la redirección?

Me gusta esto....

ls -l /var/spool | wc -c > size

De cualquier manera, quiero que esta salida numérica se asigne a una variable y no se muestre en la pantalla.

Cualquier sugerencia es muy bienvenida!

Justin
fuente

Respuestas:

12

Parece bastante sencillo.

romano@RRyS:~$ size=$(ls -l /var/spool | wc -c)
romano@RRyS:~$ echo $size
476

La sintaxis de shell se $(command)ejecuta commandy devuelve la salida estándar: solo guárdela en una variable.

Su comando:

ls -l /var/spool | wc -c > size 

creará un archivo nombrado sizeen el directorio actual (que contiene el número y una nueva línea).

Rmano
fuente
o volver a citar el comando: size=`ls -l /var/spool | wc -c`. use este formato en su respuesta: "` `size =` ls -l / var / spool | wc -c` `` "sin comillas dobles;)
αғsнιη
1
@KasiyA Prefiero usar $()por las razones explicadas aquí: stackoverflow.com/a/9449788/2907484 :-)
Rmano
1
(1) Después de hacerlo ls -l /var/spool | wc -c > size_file, podrías read size_var < size_file. (2) Consulte también ¿Puede $ () reemplazar siempre los backticks para la sustitución de comandos?
G-Man dice 'reinstalar a Monica' el
6

Prefiero la solución que ofrece la respuesta de Rmano , pero si desea utilizar solo la redirección:

read size < <(ls -l /var/spool | wc -c)
Radu Rădeanu
fuente
1
La principal ventaja de utilizar solamente la redirección es que no se trague errores (dependiendo de cómo usted tiene su guión establecido para el procesamiento de tubería - set -e, set -o pipefail, etc.). Entonces, si usa $(…)su script, siempre continuará, mientras que con la redirección se puede configurar para que falle. (que puede ser lo que quieras o no).
Garrett Motzner