सिस्टम कमांड कैसे बनाये जाते हैं जैसे ls?


19

मुझे * निक्स के बारे में कुछ संदेह है।

  • मुझे नहीं पता कि किस प्रकार की निष्पादन योग्य फ़ाइल है ls, चाहे वह .sh या .ksh है या किसी अन्य प्रकार का सिस्टम निष्पादन योग्य है यदि वह है, तो वह क्या है?

  • जब मैंने यह देखने की कोशिश की कि lsकमांड कोड का स्रोत कैसा दिखता है, तो यह कुछ अपठनीय है, इस प्रकार की अपठनीय फ़ाइलों को बनाने के लिए कौन सी विधि * nix का उपयोग करती है और क्या मैं इन फ़ाइलों के समान अपनी फ़ाइलें बना सकता हूं (जैसे ls- अपठनीय)।



4
मुझे लगता है कि यह अधिक से अधिक URL से संबंधित है क्योंकि यह एक डुबकी है।
स्लम

जवाबों:


31

आप fileकमांड और कमांड का उपयोग करके यूनिक्स में एक निष्पादन योग्य की प्रकृति निर्धारित कर सकते हैं type

प्रकार

आप typeडिस्क पर एक निष्पादन योग्य स्थान निर्धारित करने के लिए उपयोग करते हैं जैसे:

$ type -a ls
ls is /usr/bin/ls
ls is /bin/ls

तो अब मुझे पता है कि ls2 स्थानों में मेरे सिस्टम पर यहाँ स्थित है: /usr/bin/ls& /bin/ls। उन निष्पादनों को देखकर मैं देख सकता हूँ कि वे समान हैं:

$ ls -l /usr/bin/ls /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /usr/bin/ls

नोट: आप पुष्टि कर सकते हैं कि वे उपयोग करके cmpया उनके आकार से परे समान हैं diff

अंतर के साथ
$ diff -s /usr/bin/ls /bin/ls
Files /usr/bin/ls and /bin/ls are identical
cmp के साथ
$ cmp /usr/bin/ls /bin/ls
$ 

फ़ाइल का उपयोग करना

यदि मैं उन्हें fileकमांड का उपयोग करके क्वेरी करता हूं :

$ file /usr/bin/ls /bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped
/bin/ls:     ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped

तो ये वास्तविक भौतिक कार्यक्रम होंगे जिन्हें C / C ++ से संकलित किया गया है। यदि वे शेल स्क्रिप्ट थे, तो वे आम तौर पर इस तरह प्रस्तुत करते हैं file:

$ file somescript.bash 
somescript.bash: POSIX shell script, ASCII text executable

ईएलएफ क्या है?

ELF एक फाइल फॉर्मेट है , यह एक कंपाइलर का आउटपुट है gcc, जैसे कि C / C ++ प्रोग्राम को कंपाइल करने के लिए उपयोग किया जाता है ls

कंप्यूटिंग में, निष्पादन योग्य और जोड़ने योग्य प्रारूप (ईएलएफ, जिसे पहले एक्स्टेंसिबल लिंकिंग प्रारूप कहा जाता है) निष्पादनयोग्य, वस्तु कोड, साझा पुस्तकालयों और कोर डंप के लिए एक सामान्य मानक फ़ाइल प्रारूप है।

यह आमतौर पर फ़ाइल नाम में निम्नलिखित एक्सटेंशन में से एक होगा: कोई नहीं, .o, .so, .elf, .prx, .puff, .bin


@lgeorget - प्रकार बनाम का उपयोग करने के सुझावों के लिए इस प्रश्नोत्तर को देखें: unix.stackexchange.com/questions/85249/… । यह आमतौर पर सबसे अच्छा है बस typeकहीं भी उपयोग करने के लिए आप का उपयोग करने के लिए परीक्षा whichया whereis
SLM

3
इसके अतिरिक्त, GNU टूल्स के लिए, स्रोत कोड स्वतंत्र रूप से उपलब्ध है, gnu.org/software
ग्लेन जैकमैन

समान परीक्षण के लिए, आपको वास्तव में कुछ का उपयोग करना चाहिए md5sumया sha1sum, न कि केवल फ़ाइल आकार और समय की जांच करना चाहिए ।
बॉब

@ थोबड़ा - समान होने वाली उन फाइलों का Q से कोई लेना-देना नहीं था इसलिए मैंने एक सरल तरीका दिखाया। फ़ाइलों की तुलना करने के लिए मैंने अधिक उपयुक्त उपकरण का उपयोग किया होगा जैसे कि cmp जो बाइनरी फ़ाइलों की तुलना करने के लिए होता है। यह देखने के लिए कि वे किस पैकेज द्वारा प्रदान किए गए हैं, यह दर्शाता है कि वे संबंधित हैं या नहीं। वे दोनों का हिस्सा हैं coreutils-8.21-13.fc19.x86_64और मुझे पता है कि वे Red Hat रिलीज से निपटने के 20 साल से समान हैं।
slm

@ याकूब - फाइलों की तुलना करने पर उदाहरण के लिए अपडेट देखें।
slm

9

यह एक द्विआधारी निष्पादन योग्य है (मशीन कोड में संकलित, अधिकांश सिस्टम की तरह)। शैल स्क्रिप्ट "गोंद" की तरह अधिक हैं जो जल्दी से और लचीले ढंग से मौजूदा सामान से समाधान बनाने के लिए भागों को एक साथ जोड़ते हैं। यही * निक्स की शक्ति है।

आपको स्रोत कोड की आवश्यकता है (c, कभी-कभी c ++, * nix पर सबसे आम भाषाएं हैं), न कि केवल संकलित निष्पादन योग्य। जैसा कि यह खुला स्रोत है, आप ऑनलाइन रिपॉजिटरी से हर चीज के लिए कोड प्राप्त कर सकते हैं (मुख्य उपयोगिताओं आमतौर पर ग्नू प्रोजेक्ट से हैं)। हालाँकि, यह थोड़ा मुश्किल है अगर आपको नहीं पता कि कैसे git या अन्य संस्करण ट्रैकिंग सिस्टम का उपयोग करना है।

यहाँ ls.c फ़ाइल, अगर यह मदद करता है: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c


ओह और इस सवाल को स्पष्ट करने के लिए कि बाइनरी एप्लिकेशन कैसे बनाए जाएं: अनगिनत प्रोग्रामिंग भाषाओं में से चुनें (एक जोड़े को छोड़कर जो व्याख्या या अर्ध-व्याख्या की जाती है, जैसे कि अजगर, जावा, जावास्क्रिप्ट, ... जो परंपरागत रूप से एक स्टैंडअलोन निष्पादन योग्य नहीं बनाते हैं। बाइनरी फ़ाइल)। फिर उस भाषा का उपयोग करना सीखें और उसे कैसे संकलित करें।
ओरियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.