2017-10-25 6 views
3

Ich bin derzeit auf der Suche, wie Pipelining in Shells verwaltet wird. zum Beispiel in meiner Shell, wenn ich "ls | wc | less" eingeben. Das Ergebnis dieser Operation wird die Schaffung von drei Prozessen sein, ls wc und weniger. Der Ausgang von ls wird an den Eingangseingang von wc geleitet, und der Ausgang von wc wird an den Eingangseingang von less geleitet.Pipeline-Verwaltung in Linux-Shell

Für mich bedeutet es, dass während der Ausführung von "ls | wc | less". Die Standardeingabe von weniger wird nicht die Tastatur, sondern die Ausgabe von wc sein. Aber weniger wird immer noch auf meine Tastatur reagieren. Warum ? Ich verstehe das nicht, denn für mich sollte weniger nicht empfindlich auf die Tastatur reagieren, seit es gepiped wurde.

Hat jemand eine Idee? Danke

+1

Nicht stdin mit einem tty zusammenführen. Häufig ist die tty mit den stdio-Strömen eines Prozesses verbunden. Häufiger ist es nicht. Das ist eine große Frage und eine gute Demonstration der Unterscheidung zwischen tty und stdin. –

Antwort

2

Der Code von weniger

#if HAVE_DUP 
    /* 
    * Force standard input to be the user's terminal 
    * (the normal standard input), even if less's standard input 
    * is coming from a pipe. 
    */ 
    inp = dup(0); 
    close(0); 
#if OS2 
    /* The __open() system call translates "/dev/tty" to "con". */ 
    if (__open("/dev/tty", OPEN_READ) < 0) 
#else 
    if (open("/dev/tty", OPEN_READ) < 0) 
#endif 
     dup(inp); 
#endif 

Es von/dev/tty einen direkten Strom öffnet sowie was auch immer Ihr stdin ist.

+0

Bedeutet dies, dass immer noch weniger vom wc-Ausgang UND vom/dev/tty gelesen wird? – toto

+0

Ja. Die Daten, die es von seiner Standardeingabe liest (das ist die Pipe, deren anderes Ende als Standardausgabe von "wc" verwendet wird), ist die Schreibweise ihrer Standardausgabe. Die Daten, die es aus '/ dev/tty 'liest, werden als interaktive Befehle interpretiert. – chepner

1

Nur eine Vermutung - weniger öffnet /dev/console für die interaktive Sitzung, habe ich diesen Trick einmal verwendet. Ich war falsch - strace dein Freund :-):

echo | strace less 

) = 16 
read(0, "\n", 8192)      = 1 
write(1, "\n", 1 
)      = 1 
read(0, "", 8191)      = 0 
write(1, "\33[7m(END)\33[27m\33[K", 17(END)) = 17 
read(3, 

Wie Sie sehen können, ist weniger von FD Lesen 3.

/* Standard file descriptors. */ 
#define STDIN_FILENO 0 /* Standard input. */ 
#define STDOUT_FILENO 1 /* Standard output. */ 
#define STDERR_FILENO 2 /* Standard error output. */ 

Und ein genauerer Blick (nach 'q') zeigt:

open("/dev/tty", O_RDONLY)    = 3 

Welche @ Quellcode Inspektion 123s bestätigt - es öffnet /dev/tty.