2010-10-08 12 views
16

जब किसी कमांड का आउटपुट किसी फ़ाइल पर रीडायरेक्ट किया जाता है, तो आदेश फ़ाइल को कमांड निष्पादित करने से पहले खोल द्वारा बनाया या छोटा कर दिया जाता है, कोई विचार क्या बिल्ली foo> foo करता है?यूनिक्स में "बिल्ली फ़ाइल 1> फ़ाइल 1 क्या करता है?"

+1

मुझे संदेह है कि यह खोल के व्यवहार का एक बहुत अच्छा परीक्षण होगा। –

उत्तर

17

सभी मामलों में, फ़ाइल काट दिया गया। ऐसा इसलिए है क्योंकि शेल द्वारा पुनर्निर्देशन को संभाला जाता है, जो आदेश को आमंत्रित करने से पहले फ़ाइल के लिए फ़ाइल खोलता है।

cat foo > foo 

खोल ट्रंकेटस और लिखने के लिए foo को खोलता है, फाइल करने के लिए stdout सेट, और फिर कार्यकारी के ["cat", "foo"]

जीएनयू बिल्ली स्मार्ट है और फ़ाइल को खुद को रीडायरेक्ट करने से इंकार कर देती है। यह इनपुट और आउटपुट फ़ाइल डिस्क्रिप्टर पर डिवाइस/इनोड जोड़ी की जांच करके करता है; आप src/cat.c में अद्भुत निम्न-स्तरीय विवरण पढ़ सकते हैं। यह एक संदेश प्रिंट करता है और छोड़ देता है।

बीएसडी बिल्ली की ऐसी सुरक्षा नहीं है, लेकिन चूंकि फ़ाइल को पहले से ही छोटा कर दिया गया है, पढ़ने के लिए कुछ भी नहीं है, लिखने के लिए कुछ भी नहीं है, और यह रुक जाएगा।


आप छंटनी के बजाए चीजों को थोड़ा सा मसाला कर सकते हैं।

echo hello > foo 
cat foo >> foo 

अब सबकुछ समान है, खोल को खोलने के बजाय खोलने के लिए फ़ाइल खोलता है।

जीएनयू बिल्ली देखता है कि आप क्या कर रहे हैं और बंद हो जाता है; फाइल छूटी हुई है।

बीएसडी बिल्ली एक पाश में जाती है और जब तक आपकी डिस्क भर जाती है तब तक फ़ाइल को स्वयं में जोड़ती है।

+0

और यही कारण है कि मैक बीएसडी पर बनाया गया है। –

2

फ़ाइल को पहले छोटा कर दिया गया है और फिर पढ़ा गया है, इसलिए यह आदेश फ़ाइल को छोटा कर देगा।

जब मैंने इसे निष्पादित करने के लिए करने की कोशिश की मैं इस चेतावनी मिल गया:

बिल्ली: test.txt: इनपुट फ़ाइल आउटपुट फ़ाइल

+0

आपके पास क्या प्लेटफ़ॉर्म की 'बिल्ली' है? मेरे लिए एक खाली 'foo' फ़ाइल में' cat foo> foo' परिणाम। – birryree

4

फेडोरा 13 है यह मैं क्या देख रहा है

cat foo > foo 
cat: foo: input file is output file 

यदि foo पहले कुछ भी निहित है, तो यह चला गया है।

1

शैल काटना होगा, cat जाहिरा तौर पर एक नामित parm की जाँच करता है, लेकिन जैसा कि नीचे stdin के खिलाफ जांच नहीं करेगा और हमेशा सफल होता है:

$ uname -a 
Linux bar 2.6.18-164.15.1.el5PAE #1 SMP Wed Mar 17 12:14:29 EDT 2010 i686 i686 i386 GNU/Linux 
$ dd if=/dev/urandom of=foo bs=1024 count=4 
4+0 records in 
4+0 records out 
4096 bytes (4.1 kB) copied, 0.00334456 seconds, 1.2 MB/s 
$ od -c foo |head -2 
0000000 U 371 003 z 224 334 z K 236 221 k  < c 256 ! 
0000020 % % 256 V \ 005 , 254 X 202 330 004 222 " 037 226 
$ cat <foo >foo && od -c foo 
0000000 
+0

आपके सभी उत्तरों के लिए धन्यवाद। वे हर सहायक थे। – HelloWorld

संबंधित मुद्दे