Ich möchte den Inhalt einer Datei zur ls
Befehlseingabe umleiten :
ls -l < /home/john/1.txt
Wo der 1.txt
Inhalt nur ist:
/etc
Ich hatte erwartet ls
, den Inhalt der Datei aufzulisten, der in dir definiert /home/jonh1.txt
ist, /etc
aber den Eingabestream zu ignorieren scheint - listet weiterhin den Inhalt des aktuellen Verzeichnisses von /etc
dir auf, wie in /home/jonh1.txt
file definiert .
bash
redirection
input
Mulligun007
quelle
quelle
ls
, Pipe den Inhalt einer Datei nachls
.stat
könnte nützlich seinAntworten:
Ja. Das
ls
Programm verwendet den Eingabestream nie , da er nicht zum Lesen von Daten aus dem Eingabestream geschrieben wurde. Dies ist nicht automatisch in einem Unix-Programm enthalten, sondern muss separat implementiert werden.Verwechseln Sie den Eingabestream (stdin) nicht mit den Befehlszeilenargumenten (argv). Ersteres ist ein tatsächlicher Stream, der Zeile für Zeile gelesen werden kann, während Letzteres ein einfaches Nur-Lese-Array von Wörtern ist. In Ihrem Fall sind beide vorhanden und enthalten unterschiedliche Daten.
(Warum sollte es nicht für alle Programme automatisch sein? Nehmen Sie als Beispiel sort oder cat oder grep . Diese Programme akzeptieren verschiedene Arten von Werten - Dateinamen als Argumente, aber Text als Standardinhalt. Sie können also jeden Befehl an leiten
| sort
Wenn jedoch stdin und command-line dasselbe sind, können Sie nichts| sort
mehr einlesen, da der Eindruck entsteht, dass die Pipe-Eingabe eine Liste von Dateinamen ist, oder umgekehrt es Dateinamen, weil es nur die Namen sortieren würde.)Eine alternative Einstellung finden Sie in dieser Erklärung zu StackOverflow (die Sie bereits in den Kommentaren erhalten haben).
quelle
Versuchen Sie es mit xargs:
quelle
Wenn Sie ein Befehlszeilenprogramm schreiben, das Eingaben vom Benutzer entgegennimmt, werden Sie sehr deutlich sehen, was los ist. Wenn ein Programm eine read / readLine-Anweisung hat (verschiedene Sprachen können ihm einen anderen Namen geben), fordert das Programm den Benutzer zur Eingabe auf. Sie können diese Eingabe auch mit
|
oder weiterleiten oder umleiten<
Wenn Sie sich ein Programm ansehen, das Eingaben entgegennimmt, sehen Sie wie mit
more
oderless
, wenn Sie es ohne Eingabe eingeben$more<ENTER>
, werden Sie zur Eingabe aufgefordert. Durch die Weiterleitung von Daten wird die Eingabeaufforderung gestoppt. Wenn wir sed ohne Parameter ausführen$sed<ENTER>
, gibt es sicher einen Fehler, und wir können es auch nicht$echo abc|sed<ENTER>
. Wenn wir dies jedoch tun, werden$sed 's/a/b/'<ENTER>
Sie zur Eingabe aufgefordert. Und deshalbecho abc|sed 's/a/b/'<ENTER>
funktioniert.Sie können dies sehen, wenn Sie ein Programm schreiben, das so einfach wie Hello World ist, aber Eingaben erfordert, wie das Programm nach einem Wort fragt, und wenn die Person 'abc' eingibt, heißt es "Hello abc". Sie können zu diesem Programm weiterleiten. Es ist keine zusätzliche Programmierung erforderlich, um das Piping und die Umleitung der Eingaben zum Funktionieren zu bringen. Wenn das Programm Tastatureingaben vom Benutzer akzeptiert, funktioniert die Weiterleitung und Umleitung zu ihm, und das Programm fordert dann nicht zur Eingabe auf.
quelle