Redirecionando a saída para uma variável?

9

Eu sou interessante em direcionar a saída de dois comandos para uma variável. Eu não quero que a saída seja exibida na tela, mas atribuída a uma variável dentro do meu script para que eu possa usá-lo novamente.

o que estou fazendo é obter o tamanho do arquivo de um diretório usando os comandos abaixo:

ls -l /var/spool | wc -c

Este comando fornece o tamanho do arquivo em bytes e exibe a saída como um número inteiro. Estou interessado em obter esse número inteiro atribuído a uma variável do meu gosto para que eu possa compará-lo com outra variável posteriormente

Isso não parece funcionar:

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

O redirecionamento funcionaria?

Como isso....

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

De qualquer maneira, quero que essa saída numérica seja atribuída a uma variável e não seja exibida na tela.

Todas as sugestões são muito bem-vindas!

Justin
fonte

Respostas:

12

Parece bem direto.

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

A sintaxe do shell é $(command)executada commande retorna a saída padrão: salve-a em uma variável.

Seu comando:

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

criará um arquivo nomeado sizeno diretório atual (contendo o número e uma nova linha).

Rmano
fonte
ou back-citar o comando: size=`ls -l /var/spool | wc -c`. use este formato na sua resposta: "` `size =` ls -l / var / spool | wc -c` `` "sem aspas;)
αғsнιη
1
@KasiyA Eu prefiro usar $()pelos motivos explicados aqui: stackoverflow.com/a/9449788/2907484 :-) #
Rmano Rmano
1
(1) Depois de fazer ls -l /var/spool | wc -c > size_file, você poderia read size_var < size_file. (2) Veja também O $ () sempre pode substituir backticks para substituição de comando?
G-Man Diz 'Reinstate Monica'
6

Prefiro a solução oferecida pela resposta da Rmano , mas se você quiser usar apenas o redirecionamento:

read size < <(ls -l /var/spool | wc -c)
Radu Rădeanu
fonte
1
A principal vantagem de usar apenas o redirecionamento é que ele não engole erros (dependendo de como você tem o seu script configurado para processamento de tubo - set -e, set -o pipefail, etc.). Portanto, se você usar $(…)seu script, sempre continuará, enquanto o redirecionamento poderá ser configurado para falhar. (que pode ser o que você deseja ou não).
Garrett Motzner