Ls und Eingabeumleitung


-2

Ich möchte den Inhalt einer Datei zur lsBefehlseingabe umleiten :

ls -l < /home/john/1.txt

Wo der 1.txtInhalt nur ist:

/etc

Ich hatte erwartet ls, den Inhalt der Datei aufzulisten, der in dir definiert /home/jonh1.txtist, /etcaber den Eingabestream zu ignorieren scheint - listet weiterhin den Inhalt des aktuellen Verzeichnisses von /etcdir auf, wie in /home/jonh1.txtfile definiert .



1
Was ist das Ziel, eine ls-ähnliche Auflistung bestimmter Dateien zu erhalten (aus einer Liste in einer separaten Textdatei)? statkönnte nützlich sein
Xen2050

Antworten:


3

es scheint den Eingabestream zu ignorieren

Ja. Das lsProgramm 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 | sortWenn jedoch stdin und command-line dasselbe sind, können Sie nichts | sortmehr 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).


1

Versuchen Sie es mit xargs:

xargs ls -l < /home/john/1.txt

Ich habe nicht nach einer alternativen Möglichkeit gefragt, aber WARUM ignoriert ich den Eingabestream nicht?
Mulligun007

3
Bitte bearbeiten Sie Ihre Frage, um dies genauer zu erfragen. Im Moment enthält Ihre Frage nicht einmal das Wort " Warum" . Es ist schwierig zu wissen, was Sie von einer Antwort erwarten.
Twisty Imitator

1
@ Mulligun007 Nein, hast du nicht.
Luke Girvin

1

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 moreoder less, 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 deshalb echo 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.