कभी-कभी आपकी स्क्रिप्ट को अलग-अलग लिनक्स पर अलग तरह से व्यवहार करने की आवश्यकता होती है। मैं यह कैसे निर्धारित कर सकता हूं कि लिपि का कौन सा संस्करण स्क्रिप्ट पर चल रहा है?
कभी-कभी आपकी स्क्रिप्ट को अलग-अलग लिनक्स पर अलग तरह से व्यवहार करने की आवश्यकता होती है। मैं यह कैसे निर्धारित कर सकता हूं कि लिपि का कौन सा संस्करण स्क्रिप्ट पर चल रहा है?
जवाबों:
डिस्ट्रो पर आधारित कोशिशों और मान्यताओं को मत बनाइए जो आप कर सकते हैं और नहीं कर सकते हैं, इस तरह से पागलपन निहित है (यह भी देखें "उपयोगकर्ता एजेंट का पता लगाना")। इसके बजाय, यह पता लगाएं कि क्या यह है कि आप जो करना चाहते हैं वह समर्थित है, और जो भी कमांड या फ़ाइल स्थान आप उपयोग करना चाहते हैं वह कैसे किया जाता है।
उदाहरण के लिए, यदि आप एक पैकेज स्थापित करना चाहते हैं, तो आप यह पता लगा सकते हैं कि आप डेबियन-जैसी प्रणाली या रेडहैट जैसी प्रणाली के लिए dpkg या rpm के अस्तित्व की जाँच करके देख रहे हैं (पहले dpkg के लिए जाँच करें, क्योंकि डेबियन मशीनें हो सकती हैं) उन पर आरपीएम कमांड ...)। इसके आधार पर अपना निर्णय लें कि क्या करना है, न कि यह कि यह डेबियन या रेडहैट प्रणाली है। इस तरह आप स्वचालित रूप से किसी भी व्युत्पन्न डिस्ट्रोस का समर्थन करेंगे जो आपने स्पष्ट रूप से प्रोग्राम में नहीं किया था। ओह, और यदि आपके पैकेज को विशिष्ट निर्भरता की आवश्यकता है, तो उन लोगों के लिए भी परीक्षण करें और उपयोगकर्ता को बताएं कि वे क्या याद कर रहे हैं।
एक और उदाहरण नेटवर्क इंटरफेस के साथ भरा हुआ है। यह पता लगाने के लिए कि वहाँ क्या है / a / etc / network / interfaces file या / etc / sysconfig / network-script डायरेक्टरी पर आधारित है, और वहाँ से क्या करना है।
हां, यह अधिक काम है, लेकिन जब तक आप उन सभी गलतियों का रीमेक नहीं बनाना चाहते जो वेब डेवलपर्स ने पिछले एक दशक या उससे अधिक समय से की हैं, तो आप इसे शुरू से ही सही तरीके से करेंगे।
कोई क्रॉस-वितरण तरीका नहीं है। तथापि:
- रेडहैट और दोस्त:
/etc/redhat-release
सामग्री की जांच करें- डेबियन: परीक्षण के लिए
/etc/debian_version
, सामग्री की जाँच करें- मांडवी और मित्र:
/etc/version
सामग्री की जाँच करें, के लिए- स्लैकवेयर: टेस्ट के लिए
/etc/slackware-version
, सामग्री की जाँच करें
आदि आम तौर पर बोल रहा है, के लिए जाँच करें /etc/*-release
और /etc/*-version
।
संपादित करें: मेरी एक पुरानी (1+ वर्ष) की स्क्रिप्ट मिली जो चारों ओर पड़ी हुई थी कि मैंने वर्षों से एक साथ मिलकर काम किया होगा (इसका प्रभावशाली CVS लॉग 6 वर्ष पीछे जा रहा है।) यह अब और के रूप में ठीक से काम नहीं कर सकता है। के खिलाफ परीक्षण करने के लिए स्थापित विकृतियों को खोजने के लिए परेशान नहीं होना चाहिए, लेकिन यह आपको एक अच्छा शुरुआती बिंदु प्रदान करना चाहिए। यह CentOS, Fedora और Gentoo पर ठीक काम करता है। ग्यारसु ने डेबियन लेनी पर इसका सफल परीक्षण किया।
#!/bin/bash
get_distribution_type()
{
local dtype
# Assume unknown
dtype="unknown"
# First test against Fedora / RHEL / CentOS / generic Redhat derivative
if [ -r /etc/rc.d/init.d/functions ]; then
source /etc/rc.d/init.d/functions
[ zz`type -t passed 2>/dev/null` == "zzfunction" ] && dtype="redhat"
# Then test against SUSE (must be after Redhat,
# I've seen rc.status on Ubuntu I think? TODO: Recheck that)
elif [ -r /etc/rc.status ]; then
source /etc/rc.status
[ zz`type -t rc_reset 2>/dev/null` == "zzfunction" ] && dtype="suse"
# Then test against Debian, Ubuntu and friends
elif [ -r /lib/lsb/init-functions ]; then
source /lib/lsb/init-functions
[ zz`type -t log_begin_msg 2>/dev/null` == "zzfunction" ] && dtype="debian"
# Then test against Gentoo
elif [ -r /etc/init.d/functions.sh ]; then
source /etc/init.d/functions.sh
[ zz`type -t ebegin 2>/dev/null` == "zzfunction" ] && dtype="gentoo"
# For Slackware we currently just test if /etc/slackware-version exists
# and isn't empty (TODO: Find a better way :)
elif [ -s /etc/slackware-version ]; then
dtype="slackware"
fi
echo $dtype
}
ध्यान दें कि यह केवल बैश में सही ढंग से काम करेगा। आप इसे अन्य गोले के लिए फिर से लिख सकते हैं।
कहा जा रहा है कि आप सुविधाओं के लिए परीक्षण करना चाहते हैं, वितरण के लिए नहीं। मैं इसे अब और उपयोग नहीं कर रहा हूं क्योंकि यह रखरखाव का बोझ बन गया है। क्रॉस-डिस्ट्रीब्यूशन टूल और सॉल्यूशंस पर भरोसा करना आसान है।
वैचारिक रूप से, यह क्या होता है:
- एक ज्ञात, "सामान्य इनिट स्क्रिप्ट फ़ंक्शन" फ़ाइल के प्रकार में खींचो। वे वितरण-विशिष्ट हैं। यदि यह मौजूद नहीं है, तो अगले वितरण चेक पर जाएं।
- उस मूल लिपि से एक विशिष्ट, ज्ञात-से-मौजूद, अक्सर-उपयोग किए जाने वाले और नाम बदला जाने वाले फ़ंक्शन के अस्तित्व की जांच करें। हम
type
बैश बिलिन का उपयोग करते हैं । यदि वह प्रतीक एक फंक्शन है तोtype -t
रिटर्नfunction
करता है। हमzz
आउटपुट से प्रिपेंड करते हैंtype -t 2>/dev/null
क्योंकि अगर नाम से परिभाषित नहीं किया गया है तो आउटपुट स्ट्रिंग खाली हो जाएगा और हमें==
ऑपरेटर को लापता बाएं हाथ के बारे में एक सिंटैक्स त्रुटि मिलेगी । यदि हमारे द्वारा अभी-अभी चेक किया गया नाम कोई फ़ंक्शन नहीं है, तो अगले वितरण चेक पर जाएं, अन्यथा हमें वितरण प्रकार मिला।- अंत में, वितरण प्रकार को प्रतिध्वनित करें ताकि फ़ंक्शन आउटपुट का उपयोग आसानी से एक मामले में किया जा सके .. esac ब्लॉक।
यदि आप इसे एक सीधी स्क्रिप्ट के रूप में चलाने का प्रयास कर रहे हैं, तो संपादित करें: इस स्क्रिप्ट को अन्य स्क्रिप्ट्स से प्राप्त या शामिल किया जाना चाहिए। यह अपने आप कुछ भी आउटपुट नहीं करता है अगर आप इसे चलाते हैं। इसका परीक्षण करने के लिए, इसे स्रोत करें और फिर फ़ंक्शन को लागू करें, जैसे:
source /path/to/this/script.sh
get_distribution_type
बैश प्रॉम्प्ट पर।
संपादित करें: कृपया ध्यान दें कि इस स्क्रिप्ट को मूल विशेषाधिकारों की आवश्यकता नहीं है। मेरा आपसे आग्रह है कि इसे जड़ के रूप में न चलाएं। कुछ भी नुकसान नहीं करना चाहिए, लेकिन कोई जरूरत नहीं है।
सीवीएस लॉग में एक प्रासंगिक मेलिंग सूची पोस्ट का लिंक मिला । इनग्रैट इनिट स्क्रिप्ट स्पेगेटी में उपयोगी होना चाहिए।
आप कर्नेल संस्करण को चलाकर पा सकते हैं uname -a
, डिस्ट्रो संस्करण ढूंढना डिस्ट्रो पर निर्भर है।
उबंटू और कुछ अन्य ओएस पर आप चला सकते हैं lsb_release -a
या पढ़ सकते हैं / etc / lsb_release
डेबियन संस्करण को / etc / debian_version में संग्रहीत करता है
अधिकांश डिस्ट्रो के पास विशेष वितरण का निर्धारण करने की एक अनूठी विधि है।
उदाहरण के लिए:
Redhat (And derivatives): /etc/redhat-release
SUSE: /etc/SUSE-release
वहाँ एक मानक है जिसे लिनक्स मानक बेस या एलएसबी के रूप में जाना जाता है । यह परिभाषित करता है कि एक फ़ाइल होनी चाहिए जिसे / etc / lsb-release या lsb_release नाम का एक प्रोग्राम होना चाहिए जो आपके linux distro के बारे में जानकारी वापस गूँजती हो।
lsb_release -a
lsb_release
CentOS 6. पर मौजूद नहीं है
python -c 'import platform ; print platform.dist()[0]'
python -c 'import platform; print(platform.dist()[0])'
दूंगा, क्योंकि यह उस तरह से भी काम करता है जब सामान्य अजगर अजगर को बचाता है।
अन्य उत्तरों के अलावा: यदि आप केवल एक फ़ाइल को पार्स करना चाहते हैं, तो अधिकांश डिस्ट्रो ट्टी लॉगिन को / etc समस्या के माध्यम से वैयक्तिकृत करते हैं:
लिनक्स एंटरप्राइज सर्वर 10 SP2 (i586) - कर्नेल \ r (\ l) में आपका स्वागत है।
और हाँ, मुझे पता है कि यह सबॉप्टीमल है। :)
आपको बस uname -a
अपने पसंदीदा शेल में टाइप करना है । यह कर्नेल नाम और संस्करण का प्रिंट आउट लेगा।
मैं मार्क, एडम और मिहाई (अपर्याप्त प्रतिष्ठा के कारण वोट नहीं दे सकता) के साथ सहमत हूं। एलएसबी और इसके सापेक्ष एफएचएस पर आधारित समाधान अधिकांश वितरणों के साथ काम करेंगे और भविष्य में काम जारी रखने की संभावना है। LSB और FHS आपके मित्र हैं।
लिनक्स का संस्करण एक कठिन प्रश्न है। यदि हम इसे संकीर्ण रूप से देखें तो हमारे पास कर्नेल संस्करण है जिसे आप " uname -r
" के साथ प्राप्त कर सकते हैं । वितरण संस्करण ज्यादातर अप्रासंगिक है। कुछ वितरण बेहतर हैं (उद्यम वितरण जैसे कि रेडहैट एंटरप्राइज लिनक्स)। जेंटू जैसे अन्य वितरण मूल रूप से लक्ष्य हैं जो बिल्कुल समझदार संस्करण नहीं हैं। यदि आपको संस्करण पर आधारित चीजें करने की आवश्यकता है, तो उन प्रमुख घटकों पर एक नज़र डालें जो आपके लिए प्रासंगिक हैं:
Component Version command
glibc /lib/libc.so.6
gcc gcc --version
X xdpyinfo
libX11 pkg-config --modversion x11
gtk+ pkg-config --modversion gtk+-2.0
qt-4 pkg-config --modversion QtCore
etc...
आप ग्रब मेनू भी देख सकते हैं, आमतौर पर आपको डिस्ट्रो / वर्जन की जानकारी का एक गुच्छा दिया जाता है :-)
फ्यूजन इन्वेंटरी एक क्रॉस-प्लेटफ़ॉर्म लाइटवेट इन्वेंट्री टूल है जो कई लिनक्स डिस्ट्रोस पर बल्कि बीएसडी, विंडोज, मैकओएस एक्स और अन्य यूनियनों पर भी यह जानकारी प्राप्त कर सकता है।
यदि उपलब्ध हो, तो वे उपयोग करते हैं lsb_release
(जैसा कि ऊपर कुछ बार उल्लेख किया गया है), लेकिन अगर उनके पास डिस्ट्रीक नाम और संस्करण की जांच करने के लिए फ़ाइलों और नियमित अभिव्यक्तियों की बहुत उपयोगी सूची नहीं है: https://github.com/fusinv/fusioninventory-agent/ blob / 2.2.x / lib / FusionInventory / Agent / Task / Inventory / Input / Linux / Distro / NonLSB.pm # L16 ।
मैं इस तर्क को प्राप्त करने के बजाय, इस जानकारी को प्राप्त करने के लिए FusionInventory का उपयोग करने की सलाह दूंगा, क्योंकि उनका समुदाय इस कार्यक्षमता को बनाए रखेगा। आप या तो एजेंट इस्तेमाल कर सकते हैं पर यह खुद है जैसे आपके नेटवर्क में मशीनों प्रबंधन के लिए एक व्यापक समाधान के साथ या यह जोड़ी (यह एक XML / JSON फ़ाइल जो पार्स करने के लिए आसान है आउटपुट) GLPI या पतवार अपनी आवश्यकताओं पर निर्भर करता है,।