Wie liest man stdin, wenn keine Argumente übergeben werden?

8

Skript funktioniert nicht, wenn ich die Standardeingabe verwenden möchte, wenn keine Argumente (Dateien) übergeben werden. Gibt es eine Möglichkeit, stdin anstelle einer Datei in diesem Code zu verwenden?

Ich habe es versucht:

%Vor%     
aron23 27.10.2013, 14:59
quelle

5 Antworten

6

Ersetze einfach den speziell interpretierten /dev/stdin von bash als Dateinamen:

%Vor%

(Beachten Sie, dass bash diese spezielle Datei /dev/stdin verwendet, wenn sie für ein Betriebssystem erstellt wird das bietet es , aber da bash 2.04 die Abwesenheit dieser Datei auf Systemen, die es nicht unterstützen, umgehen kann.

    
pilcrow 27.10.2013, 15:15
quelle
7

Für den allgemeinen Fall, dass ein Wert von stdin gelesen werden soll, wenn ein Parameter fehlt, funktioniert dies.

%Vor%

script.sh

%Vor%     
Ryan 24.07.2015 05:31
quelle
1

Variablen wird ein Wert von Var=Value zugewiesen und diese Variable wird z. %Code%. In Ihrem Fall wäre das

%Vor%

beim Zuweisen der Standardeingabe. Ich glaube jedoch nicht, dass Variablennamen mit einem Ziffernzeichen beginnen dürfen. Siehe die Frage bash read from file oder stdin , um das Problem zu lösen.

    
Oswald 27.10.2013 15:09
quelle
0

Hier ist meine Version des Skripts:

%Vor%

Wenn die Datei im Argument nicht vorhanden ist, lesen Sie die Standardeingabe von .

Weitere Beispiele: Wie liest man aus Datei oder Standard in bash? bei stackoverflow SE

    
kenorb 28.02.2015 20:24
quelle
0

pilcrows Antwort bietet eine elegante Lösung ; Dies ist eine Erklärung dafür, warum der Ansatz des OP nicht funktioniert hat.

Das Hauptproblem des OP-Ansatzes war der Versuch, Positionsparameter mit =... zuzuweisen, was ' t arbeiten.

Die LHS wird durch die Shell um den Wert von erweitert, und das Ergebnis wird als Name der Variablen interpretiert, die zugewiesen werden soll - eindeutig nicht die Absicht.

Die einzige Möglichkeit, in bash zuzuweisen, ist über die set builtin . Der Vorbehalt ist, dass set immer all Positionsparameter festlegt, also müssen Sie auch die anderen einschließen, falls vorhanden.

%Vor%

(Wenn Sie höchstens ein 1 Argument erwarten, wird set -- "${1:-/dev/stdin}" ausreichen.)

Das obige korrigiert auch ein sekundäres Problem mit dem Ansatz des OP: der Versuch, den Inhalt und nicht den Dateinamen von stdin in zu speichern, seit < wird verwendet.

${1:-/dev/stdin} ist eine Anwendung der bash Parametererweiterung , die besagt: gib den Wert von zurück, außer ist nicht definiert (kein Argument wurde übergeben) oder sein Wert ist die leere Zeichenfolge ( "" oder '' wurde übergeben). Die Variation ${1-/dev/stdin} (no : ) würde nur /dev/stdin zurückgeben, wenn undefined ist (wenn sie irgendeinen Wert enthält, auch die leere Zeichenfolge, it würde zurückgegeben werden.

Wenn wir alles zusammensetzen:

%Vor%

Aber natürlich wäre der viel einfachere Ansatz, ${1:-/dev/stdin} direkt als Dateinamen zu verwenden:

%Vor%

oder über eine Zwischenvariable:

%Vor%     
mklement0 28.02.2015 20:47
quelle

Tags und Links