2011-05-19 13 views
13

मैं थोड़ी देर के लिए RVM का उपयोग कर किया गया है, और हर बार मैं बस कॉपी और पेस्ट की निम्न आदेश यह सेटअप पाने के लिए:क्या कोई इस वाक्यविन्यास को समझा सकता है?

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) 

यह मुझे कीड़े कि मैं पूरी तरह वाक्यविन्यास समझ में नहीं आता, और क्यों हमें डबल <, और कोष्ठक की आवश्यकता है। क्या कोई इसे समझा सकता है या मुझे सही संदर्भ में इंगित कर सकता है?

+1

क्या कोई कारण यह नहीं है: "curl -s ... | bash"? यह अत्यधिक फीचर रेंगने का एक उदाहरण जैसा दिखता है। –

+0

@ विलियम पर्सेल: मुझे आपके संस्करण और इस के बीच व्यवहार में कोई अंतर नहीं पता है। – Daenyth

उत्तर

13

पहला इनपुट इनपुट पुनर्निर्देशन है। यह प्रोग्राम में इनपुट के रूप में फ़ाइल की सामग्री को खिलाता है। दूसरा निर्माण <() है और इसकी प्रक्रिया पुनर्निर्देशन है: यह एक फ़ाइल की तरह एक प्रक्रिया के आउटपुट का इलाज करता है। इस मामले में, प्रभाव यह है कि आप उस यूआरएल की सामग्री चलाएंगे जैसे कि यह एक बैश स्क्रिप्ट था - बहुत खतरनाक! यदि आप पूरी तरह से स्रोत पर भरोसा नहीं करते हैं, तो ऐसा न करें। एक हमलावर इस विधि का उपयोग आपके आदेशों को चलाने के लिए कर सकता है जो आपके सिस्टम से समझौता करेगा।

+2

अच्छा जवाब, खासकर जब सुरक्षा समस्या को ध्यान में रखते हुए। – Mattis

+0

इस सुविधा में अंतर्दृष्टि के लिए, इसे आज़माएं: 'echo <(id)' यह आपको एक विचार देगा कि सिस्टम कैसे कार्यान्वित किया जाता है और इसका दुरुपयोग कैसे किया जा सकता है (उदाहरण के लिए 'dd if = <(foo देखें) 'cp <(देखो foo)/tmp/x' आदि) –

2

बस मेरे 2 सेंट। बैश संरचना <() @Denyth के रूप में कहा गया है "एक फाइल की तरह एक प्रक्रिया के आउटपुट का इलाज करता है"। यह संरचना बहुत उपयोगी हो सकती है। बस निम्नलिखित पर विचार:

diff <(ls dir1) <(ls dir2) 

यह dir1 और dir2 की सामग्री के बीच मतभेदों को दिखाने के लिए vimdiff का उपयोग करेगा। vimdiff का उपयोग करके diff भी कूलर होगा।

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