2017-02-04 4 views
2

dies eine sehr einfache Art und Weise funktioniert zu demonstrieren, wirdbash `las -t` nicht auf Rohr

mkfifo /tmp/a 
read -t 1 a < /tmp/a 

die Lese nie mehr zurück zu laufen.

Bash Handbuch sagt: Diese Option ist nur wirksam, wenn Leseeingang von einem Terminal, Rohr ist zu lesen, oder andere spezielle Datei; sie keinen Effekt hat, wenn sie von regulären Dateien

Lesen aber/tmp/a ist ein Rohr, Ausgabe von ls ist

ls -l /tmp/a 
prw-r--r-- 1 root root 0 Feb 4 22:18 /tmp/a 

die Bash-Version ist:

GNU bash, Version 4.3.46 (1) -release (x86_64-pc-linux-gnu) Urheberrecht (C) 2013 Free Software Foundation, Inc.

das O ist:

Ubuntu 16.04.1 LTS 

Antwort

1

Wenn Sie aus dem Rohr zu lesen, muss es jemand schriftlich an das Rohr als auch sein. "pipe" ist nur ein Kommunikationsmechanismus. Es "generiert" keine Eingaben von selbst; Es wird nur die Eingabe an sein Ausgabeende übergeben. Es scheint, dass Sie gerade lesen, aber es gibt niemanden, der an /tmp/a schreibt.

Wenn read wartet auf die Eingabe tun echo hello > /tmp/a von einem anderen Terminal, und Sie werden sehen, dass read zurückkehrt und a den Wert „Hallo“ hat.

Lesen Sie mehr über Rohrleitungen im Detail hier: http://man7.org/linux/man-pages/man7/pipe.7.html

+0

wenn ich excute: strace bash -c "lesen -t 3 a yuanjianpeng

+0

habe es, vielen Dank. Schließlich benutze ich: Timeout 3 bash -c "lesen Sie ein yuanjianpeng

+0

'lesen' ist einfach blockiert bis jemand schreibt. 'timeout' ändert sich nicht viel. Es stoppt einfach 'lesen' von weiter warten. Aber das * real * Problem ist, dass niemand in die Pipe schreibt. Vielleicht möchten Sie das Handbuch lesen, das mit verlinkt ist verstehe, wie Rohre funktionieren. – usr