Ausgabe auf eine Variable umleiten?

9

Ich bin daran interessiert, die Ausgabe von zwei Befehlen auf eine Variable zu lenken. Ich möchte nicht, dass die Ausgabe auf dem Bildschirm angezeigt wird, sondern einer Variablen in meinem Skript zugewiesen wird, damit ich sie wieder verwenden kann.

Was ich tue, ist die Dateigröße aus einem Verzeichnis mit den folgenden Befehlen abzurufen:

ls -l /var/spool | wc -c

Dieser Befehl gibt mir die Dateigröße in Bytes und zeigt die Ausgabe als Ganzzahl an. Ich bin daran interessiert, diese Ganzzahl einer Variablen nach meinem Geschmack zuzuweisen, damit ich sie später mit einer anderen Variablen vergleichen kann

Das scheint nicht zu funktionieren:

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

Würde die Umleitung funktionieren?

So was....

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

In beiden Fällen möchte ich, dass diese numerische Ausgabe einer Variablen zugewiesen und nicht auf dem Bildschirm angezeigt wird.

Anregungen sind sehr willkommen!

Justin
quelle

Antworten:

12

Es scheint ganz einfach.

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

Die Shell-Syntax wird $(command)ausgeführt commandund gibt die Standardausgabe zurück: Speichern Sie sie einfach in einer Variablen.

Ihr Befehl:

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

erstellt eine Datei mit dem Namen sizeim aktuellen Verzeichnis (die die Nummer und einen Zeilenumbruch enthält).

Rmano
quelle
oder zitieren Sie den Befehl zurück : size=`ls -l /var/spool | wc -c`. Verwenden Sie dieses Format in Ihrer Antwort: "` `size =` ls -l / var / spool | wc -c` `` "ohne doppelte Anführungszeichen;)
αғsнιη
1
@ KasiyA Ich bevorzuge $()aus den hier erläuterten Gründen: stackoverflow.com/a/9449788/2907484 :-)
Rmano
1
(1) Nachdem ls -l /var/spool | wc -c > size_fileSie dies getan haben , können Sie read size_var < size_file. (2) Siehe auch Kann $ () Backticks für die Befehlsersetzung immer ersetzen?
G-Man sagt "Reinstate Monica"
6

Ich bevorzuge die Lösung, die Rmanos Antwort bietet, aber wenn Sie nur die Umleitung verwenden möchten:

read size < <(ls -l /var/spool | wc -c)
Radu Rădeanu
quelle
1
Der Hauptvorteil von nur Umleitung ist , dass es sich nicht um Fehler zu schlucken (je nachdem , wie Sie Ihr Skript für die Rohrbearbeitung einrichten - set -e, set -o pipefailusw.). Wenn Sie also $(…)Ihr Skript verwenden, wird es immer fortgesetzt, während es bei Umleitung so eingerichtet werden kann, dass es fehlschlägt. (was kann sein, was Sie wollen oder nicht).
Garrett Motzner