Przekierowanie wyjścia do zmiennej?

9

Interesuje mnie przekierowanie wyjścia dwóch poleceń do zmiennej. Nie chcę, aby dane wyjściowe były wyświetlane na ekranie, ale zamiast tego są przypisane do zmiennej w moim skrypcie, aby móc jej ponownie użyć.

to, co robię, to uzyskanie rozmiaru pliku z katalogu przy użyciu poniższych poleceń:

ls -l /var/spool | wc -c

To polecenie podaje mi rozmiar pliku w bajtach i wyświetla wynik jako liczbę całkowitą. Jestem zainteresowany przypisaniem tej liczby całkowitej do zmiennej, która mi się podoba, aby później móc ją porównać z inną zmienną

To nie działa:

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

Czy przekierowanie działałoby?

Lubię to....

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

Tak czy inaczej chcę, aby dane liczbowe były przypisywane do zmiennej i nie były wyświetlane na ekranie.

Wszelkie sugestie są bardzo mile widziane!

Justin
źródło

Odpowiedzi:

12

Wydaje się to dość proste.

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

Składni powłoki $(command)Wykonuje commandi zwraca standardowe wyjście: wystarczy zapisać go w zmiennej.

Twoje polecenie:

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

utworzy plik o nazwie sizew bieżącym katalogu (zawierający numer i nowy wiersz).

Rmano
źródło
lub back-podać komendę: size=`ls -l /var/spool | wc -c`. użyj tego formatu w swojej odpowiedzi: "` `size =` ls -l / var / spool | wc -c `` '' bez podwójnych cudzysłowów;)
αғsнιη
1
@KasiyA Wolę używać $()z powodów wyjaśnionych tutaj: stackoverflow.com/a/9449788/2907484 :-)
Rmano
1
(1) Po wykonaniu ls -l /var/spool | wc -c > size_filemożesz read size_var < size_file. (2) Zobacz także Czy $ () zawsze zastępuje backtyki w celu zastąpienia poleceń?
G-Man mówi „Przywróć Monikę”
6

Wolę rozwiązanie oferowane przez odpowiedź Rmano , ale jeśli chcesz użyć tylko przekierowania:

read size < <(ls -l /var/spool | wc -c)
Radu Rădeanu
źródło
1
Główną zaletą korzystania tylko przekierowanie jest to, że nie połknąć błędów (w zależności od tego, jak masz skrypt skonfigurować do przetwarzania Pipe - set -e, set -o pipefailitp.) Jeśli więc użyjesz $(…)skryptu, zawsze będzie on kontynuowany, natomiast w przypadku przekierowania można go ustawić tak, aby nie działał. (które może być tym, czego chcesz lub nie).
Garrett Motzner