आपको शायद ऐसा नहीं करना चाहिए , लेकिन आप कर सकते हैं। कुसलानंद का जवाब हाथ में काम के लिए बेहतर है और इस मुद्दे को समझाता है। चूंकि आपने विशेष रूप से टर्मिनल के अंदर किसी भी पुस्तकालय कॉल का उपयोग करने का तरीका पूछा था , हालांकि, यहां कुछ तरीके हैं ...
टिनी सी संकलक ( tcc
) एक का समर्थन करता है -run
झंडा ताकि आप, आप की सुविधा देता है (प्रभाव में) एक छोटे से कार्यक्रम लिख कर सी कोड की व्याख्या कर सकते हैं कि के एक एकल मंगलाचरण के माध्यम से टर्मिनल के अंदर किसी भी पुस्तकालय कॉल का उपयोग करें।
आप strnlen
फ़ंक्शन को इस तरह से चला सकते हैं :
$ tcc -run <(echo '#include <stdio.h>'; echo '#include <string.h>'; echo 'void main(int argc, char **argv) {printf("%i\n", strnlen(argv[1], 1024));}') "Hello world"
11
यह बैश, zsh और अन्य गोले से प्रक्रिया प्रतिस्थापन का उपयोग करता हैtcc
ताकि पढ़ने के लिए एक फ़ाइल दे सके जो सभी echo
s के परिणामों को सम्मिलित करता है ; अन्य विकल्प हैं।
आप इसे बनाने के लिए एक समारोह बना सकते हैं:
call_library_function_s_i() {
func=$1
shift
tcc -run <(echo '#include <stdio.h>'; echo '#include <string.h>'; echo 'void main(int argc, char **argv) {printf("%i\n", '$func'(argv[1]));}') "$*"
}
$ call_library_function_s_i strlen hello world
(मैंने strlen
यहां इसलिए इस्तेमाल किया है कि यह एक unary function string-> int है - आपको प्रत्येक अलग-अलग एरिटी और रिटर्न टाइप के लिए एक अलग फ़ंक्शन की आवश्यकता होगी)।
एक अन्य विकल्प है बैश प्लगइन टेविस ओरमैंडी है, जो ऊपर लपेटता द्वारा और । यह संभवत: निकटतम सन्निकटन है जो आप कोशिश कर रहे थे। आप उदाहरण के लिए उपयोग कर सकते हैं:ctypes.sh
dlopen
dlsym
$ dlcall -r uint64 strlen "hello world"
और यह अपेक्षित रूप से फ़ंक्शन को कॉल करेगा।
यह "टर्मिनल से" ऐसा करने का सबसे सीधा तरीका है, लेकिन यह आपके वितरण पैकेजों के कुछ होने की संभावना नहीं है, इसलिए आपको इसे मैन्युअल रूप से स्थापित करना होगा (जो कि अप्रभावी है)। यहाँ अपनी वेबसाइट सेctypes.sh
कुछ जानकारीपूर्ण उद्धरण दिए गए हैं ताकि लोग यह महसूस कर सकें कि ऐसा करने के बारे में लोग क्या सोचते हैं:
- "बकवास"
- "इसे रोकना होगा"
- "आप इसके साथ बहुत दूर चले गए हैं"
अन्य गोले के समान उपकरण हो सकते हैं, लेकिन मैं उनके बारे में नहीं जानता। सिद्धांत रूप में इसका कोई कारण नहीं है कि एक स्टैंडअलोन कमांड नहीं हो सकता है जो बिल्कुल सरल मामलों के लिए किया था, लेकिन मुझे आश्चर्य है कि मैं एक को खोजने में सक्षम नहीं हूं ...
... तो मैंने एक बना दिया! dlcall
आपको कमांड लाइन से लाइब्रेरी फ़ंक्शन को कॉल करने देता है :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
यह फ़ंक्शन प्रोटोटाइप के सीमित सेट का समर्थन करता है, यह वर्तमान में बहुत विश्वसनीय या लचीला नहीं है, लेकिन यह अब मौजूद है।
आप उदाहरण के लिए, पायथन औरpython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
का भी उपयोग कर सकते हैं , लेकिन यह निश्चित रूप से इसके बारे में जाने का सबसे आसान तरीका नहीं है। पर्ल, रूबी और अन्य भाषाओं में समान विशेषताएं हैं जिनका आप उपयोग कर सकते हैं।
तो आपके सवालों के जवाब हैं:
- ऊपर दिए गए तरीकों में से एक का उपयोग करें।
- आपको लाइब्रेरी में आपको बूटस्ट्रैप करने के लिए एक अन्य कमांड का उपयोग करने की आवश्यकता है, या सॉफ़्टवेयर का एक टुकड़ा जो आपके शेल में हुक करता है।
सब सब में, आप लगभग निश्चित रूप से किसी भी अन्य तरीके से ऐसा करना बेहतर होगा।