यदि, जब मैं एक स्क्रिप्ट चलाता हूं, तो मैं लाइब्रेरी को प्रीलोड करने के लिए LD_PRELOAD
का उपयोग करता हूं, मुझे लगता है कि लाइब्रेरी वास्तव में केवल तभी लोड की जाती है जब स्क्रिप्ट में शेबैंग लाइन हो।क्यों LD_PRELOAD स्क्रिप्ट के साथ प्रभाव नहीं लेता है जिसमें कोई शेबैंग नहीं है?
# Not a shebang
echo Hello
और यह आदेश: उदाहरण के लिए, इस स्क्रिप्ट दी
LD_PRELOAD=/path/to/preload_me.so ./script.sh
स्क्रिप्ट पुस्तकालय के बिना चलाता है सब, पर लोड किया जा रहा है जो मैं अपने प्रारंभ की (गैर) प्रभाव के माध्यम से निगरानी कर सकते हैं कोड।
दूसरी ओर, अगर मैं एक कुटिया पंक्ति जोड़ें:
#!/bin/sh
echo Hello
... तो पुस्तकालय भरी हुई जब मैं एक ही आदेश के माध्यम से स्क्रिप्ट चलाने है। ऐसा कोई फर्क नहीं पड़ता कि कौन सा दुभाषिया निर्दिष्ट है; निश्चित रूप से मैं /bin/bash
या किसी अन्य sh
-family खोल का भी उपयोग कर सकता हूं मैंने कोशिश की है।
कोई अंतर क्यों है, और क्या यह सुनिश्चित करने का कोई तरीका है कि किसी दिए गए लाइब्रेरी को दिए गए खोल सरल आदेश से पहले प्रीलोड किया गया हो, आदेश के बावजूद?
(another question जिसका लेखक सवाल विरोध इन मामले में couched किया जा रहा से अनुकूलित।)
यह एक अच्छा जवाब है, लेकिन मुझे लगता है कि आपको यह स्पष्ट करना चाहिए कि यह विशेष रूप से 'बाश' (और शायद अन्य गोले ') पर लागू होता है, उदाहरण के लिए ऐसा नहीं लगता है। (यह स्क्रिप्ट निष्पादित करता है, लेकिन प्रीलोड प्रभावी होता है।) सभी पॉजिक्स कहते हैं, "शेल खोज के परिणामस्वरूप पथ के साथ बुलाए गए शेल के बराबर एक कमांड निष्पादित करेगा, जो कि इसके पहले ऑपरेंड के रूप में होता है," जो किसी भी व्यवहार पर लागू हो सकता है। (मेरे सिस्टम पर त्वरित परीक्षण: zsh preloads, ksh नहीं है। आंकड़ा जाओ।) – rici
@rici, उत्तर स्पष्ट रूप से कहता है कि * नई बाह प्रक्रिया निष्पादित करने के बजाय * 'bash' * कांटेदार, लेकिन मैंने फिर भी जोड़ा है एक स्पष्टीकरण। –