मैं फीफो के साथ कुछ आसान करने की कोशिश कर रहा था: रेखाएं पढ़ें, लेकिन सभी एक बार में नहीं, और यह अप्रत्याशित रूप से "काम नहीं किया"।एक शेल स्क्रिप्ट में mkfifo का उपयोग करके
यह ठीक है:
$ f=$(mktemp -u)
$ mkfifo $f
$ { seq 5 > $f; } &
[1] 2486
$ while read line; do echo $line; done < $f
1
2
3
4
5
[1]+ Done { seq 10 > $f; }
लेकिन अगर मैं लाइनों को पढ़ने के एक-एक करके की कोशिश, पहले पढ़ने सफल होता है और 2 पढ़ने रुक जाता है।
$ { seq 5 > $f; } &
[1] 2527
$ read line < $f; echo $line
1
[1]+ Done { seq 5 > $f; }
$ read line < $f; echo $line
[hangs here...]
क्या कोई इसे समझा सकता है? मैं सभी 5 लाइनों को एक-एक करके क्यों नहीं पढ़ सकता? शेष डेटा के साथ क्या हुआ?
मुझे पता चला मैं पंक्ति-दर-पंक्ति अगर मैं एक फ़ाइल विवरणक बनाने फीफो रीडायरेक्ट करने के लिए पढ़ सकते हैं:
$ { seq 5 > $f; } &
[1] 2732
$ exec 3<$f
[1]+ Done { seq 5 > $f; }
$ read -u 3 line && echo $line || echo no more data
1
$ read -u 3 line && echo $line || echo no more data
2
$ read -u 3 line && echo $line || echo no more data
3
$ read -u 3 line && echo $line || echo no more data
4
$ read -u 3 line && echo $line || echo no more data
5
$ read -u 3 line && echo $line || echo no more data
no more data
$ exec 3<&-
मैं अभी भी मध्य परिदृश्य समझ में नहीं आता। क्या कोई समझा सकता है?
संस्करण जानकारी:
$ bash --version
GNU bash, version 4.2.25(1)-release (i686-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ mkfifo --version
mkfifo (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by David MacKenzie.
यह संस्करण और बैश बनाम ksh या ?? से संबंधित हो सकता है।क्या आप वह जानकारी जोड़ सकते हैं। (मुझे किसी भी मामले में जवाब नहीं पता होगा ;-()। इस तिमाही में सबसे दिलचस्प सवाल! – shellter
ओएसएक्स मैवरिक्स और उबंटू वर्चुअलबॉक्स पर बिल्कुल वही व्यवहार। –
आपका तीसरा परिदृश्य repro'd नहीं किया जा सकता है। – devnull