जब आप किसी प्रोग्राम को xargs
इनवॉइस करते हैं, तो प्रोग्राम का स्टडिन (स्टैंडर्ड इनपुट) इंगित करता है /dev/null
। (चूँकि xargs मूल स्टड को नहीं जानता है , यह अगली सबसे अच्छी बात है।)
$ सच | xargs filan -s
० चर्देव / देव / नल
1 tty / dev / pts / 1
2 tty / dev / pts / 1
$ सच | xargs ls -l / dev / fd /
विम को अपने स्टैनिन को अपने नियंत्रित टर्मिनल के समान होने की उम्मीद है, और सीधे टर्मिनल पर विभिन्न टर्मिनल-संबंधित ioctl प्रदर्शन करता है । जब /dev/null
(या किसी भी गैर-ट्टी फाइल डिस्क्रिप्टर) पर किया जाता है, तो उन ioctls अर्थहीन होते हैं और ENOTTY को वापस कर देते हैं, जिसे चुपचाप अनदेखा कर दिया जाता है।
अधिक विशिष्ट कारण पर मेरा अनुमान: स्टार्टअप पर विम पुरानी टर्मिनल सेटिंग्स को पढ़ता है और याद करता है, और बाहर निकलते समय उन्हें पुनर्स्थापित करता है। हमारी स्थिति में, जब "पुरानी सेटिंग्स" को एक गैर-टीडी fd (फ़ाइल डिस्क्रिप्टर) के लिए अनुरोध किया जाता है, तो विम सभी मानों को खाली और सभी विकल्पों को अक्षम करता है, और लापरवाही से आपके टर्मिनल पर सेट करता है।
आप इसे रनिंग से देख सकते हैं vim < /dev/null
, इसे बाहर निकाल सकते हैं, फिर रनिंग stty
करेंगे, जो कि बहुत सारे आउटपुट देगा <undef>
। लिनक्स पर, रनिंग stty sane
टर्मिनल को फिर से उपयोग करने योग्य बना देगा (हालांकि इसमें ऐसे विकल्प खो जाएंगे जैसे कि iutf8
संभवतः बाद में छोटी-मोटी झुंझलाहट हो सकती है)।
आप विम में इस बग पर विचार कर सकते हैं , क्योंकि यह /dev/tty
टर्मिनल नियंत्रण के लिए खोल सकता है , लेकिन नहीं। (स्टार्टअप के दौरान कुछ बिंदु पर, विम अपने स्टनर को डुप्लिकेट करता है, जो इसे आपके इनपुट कमांड्स को पढ़ने की अनुमति देता है - लेखन के लिए खोले गए एक fd से - लेकिन यहां तक कि इसे जल्दी पूरा नहीं किया जाता है।)
find
याxargs
बिल्कुल नहीं। बिना तर्कों के साथ खुली विम, फिर:args **/*.txt<CR>
संपादक के अंदर से विम के तर्क सेट करने के लिए चलाएँ ।