कैसे रखें डॉटफ़ाइल्स सिस्टम-अज्ञेयवादी?


21

काम के कारण मैंने हाल ही में ओएस एक्स का उपयोग करना शुरू कर दिया है और लिनक्स के समान अनुभव प्राप्त करने के लिए होमब्रे का उपयोग करके इसे स्थापित किया है।

हालाँकि, उनकी सेटिंग में काफी अंतर हैं। कुछ को केवल एक सिस्टम पर होना चाहिए। जैसा कि मेरे dotfiles एक git रिपॉजिटरी में रहते हैं, मैं सोच रहा था कि मैं किस तरह के स्विच को जगह में स्थापित कर सकता हूं, ताकि कुछ कॉन्फ़िगरेशन केवल लिनक्स सिस्टम के लिए और अन्य ओएस एक्स के लिए पढ़ें।

डॉटफ़ाइल्स के रूप में, मैं अन्य के बीच, .bash_profilesया का उल्लेख कर रहा हूं .bash_alias


मैंने इसे गिट शाखाओं के साथ किया। मेरे पास FreeBSD, Gentoo और Ubuntu के लिए एक है। लेकिन यह आदर्श नहीं है।
राफेल एहरेंस

@RaphaelAhrens मैं इस तरह के शाखा-आधारित समाधान से बचना चाहता हूं क्योंकि यह डायवर्ज होने का खतरा है।
k0pernikus

जब आप सिस्टम विशिष्ट सामान को विशेष फ़ाइलों में डालते हैं, तो हाँ, आप इसे थोड़ा आसान बना सकते हैं। लेकिन जैसा कि मैंने कहा कि आदर्श नहीं है।
राफेल एहरेंस जुले

stackoverflow.com/questions/394230/… आप ओएस एक्स पर डार्विन के लिए जाँच कर सकते हैं।
राफेल एहरेंस

मेरा दृष्टिकोण मूल रूप से उबलता है if (exists rcfile.local); source rcfile.local; endif, उपयुक्त आर सी फ़ाइल में अनुवादित। मुख्य आरसी फ़ाइल मैं सिस्टम को अज्ञेय रखने की कोशिश करता हूं, जबकि .localसंस्करण में सिस्टम विशिष्ट सेटिंग्स हैं। यदि आप यह सब एक ही रेपो में चाहते हैं, तो आपके पास सिस्टम डायरियां हो सकती हैं और सही डायरेक्टरी में एक में rcfile.local को सिमिलर कर सकती है।

जवाबों:


22

जितना संभव हो सके डॉटफ़ाइल्स को पोर्टेबल रखें और ओएस पर निर्भर सेटिंग्स या स्विच से बचें, जिन्हें किसी विशेष संस्करण की आवश्यकता होती है, उदाहरण के लिए, GNU सिंटैक्स से बचें यदि आप सभी सिस्टम पर GNU सॉफ़्टवेयर का उपयोग नहीं करते हैं।

आप शायद उन परिस्थितियों में भाग लेंगे जहाँ सिस्टम विशिष्ट सेटिंग्स का उपयोग करना वांछनीय है। उस मामले में व्यक्तिगत सेटिंग्स के साथ एक स्विच स्टेटमेंट का उपयोग करें:

case $(uname) in
  'Linux')   LS_OPTIONS='--color=auto --group-directories-first' ;;
  'FreeBSD') LS_OPTIONS='-Gh -D "%F %H:%M"' ;;
  'Darwin')  LS_OPTIONS='-h' ;;
esac

यदि मनमाने ढंग से अनुप्रयोगों की कॉन्फ़िगरेशन फ़ाइलों को विभिन्न विकल्पों की आवश्यकता होती है, तो आप जांच सकते हैं कि क्या एप्लिकेशन संगतता स्विच या अन्य तंत्र प्रदान करता है। उदाहरण vimके लिए, आप पुराने संस्करणों, या विभिन्न फीचर सेट के साथ संकलित संस्करणों का समर्थन करने के लिए संस्करण और पैचवेल की जांच कर सकते हैं, उनके पास नहीं है। उदाहरण स्निपेट से .vimrc:

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif

uname -sकी तरह है uname। नाम का अर्थ यूनिक्स नाम है।
स्टीफन चेजालस

1
@StephaneChazelas यह सिर्फ सिस्टम में होता है या क्या इसकी गारंटी है और मैं हमेशा इसे गिरा सकता हूं -s?
मार्को

1
हाँ, unameअकेले दशकों से इसे करने का विहित तरीका रहा है और यह POSIX द्वारा निर्दिष्ट किया गया है। मूल uname(PWB यूनिक्स में) ने कोई विकल्प नहीं लिया।
स्टीफन चेजालस 10

@StephaneChazelas स्पष्टीकरण के लिए धन्यवाद, मैंने -sइस उत्तर को हटा दिया और मैं इसे अपनी भविष्य की लिपियों के लिए ध्यान में रखूंगा।
मार्को

यह एक अपेक्षाकृत छोटा विवरण है और आपके उदाहरण द्वारा बताए गए बिंदु से अलग नहीं होता है, लेकिन क्या setविमेच में वे उद्धरण वास्तव में U + 201C और U + 201D के बजाय U + 0022 होने चाहिए?
बजे एक CVn

3

यदि आप केवल उन फ़ाइलों से संबंधित हैं जो वास्तव में निष्पादित हैं, जैसे कि .bash_profiles और दोस्त, तो आप unameकोड को चलाने वाले सिस्टम के आधार पर उदाहरण के लिए उदाहरण के साथ उपयोग करने में सक्षम हो सकते हैं ।

उदाहरण के लिए , पूरी तरह से अप्रयुक्त और कैविएट के साथ कि मेरे पास ओएस एक्स नहीं है चीजों को आज़माने के लिए, यदि आपके पास वर्तमान में लिनक्स पर है:

alias ll='ls -lFA'

और मैक ओएस एक्स पर:

alias ll='ls -lFAx'

(जहाँ -xOS X lsऐसा कुछ करता है जो GNU ls डिफ़ॉल्ट रूप से करता है), तो उन्हें कुछ इस तरह से जोड़ा जा सकता है:

OS="$(uname -s)"
if test "$OS" = "Darwin"; then
    alias ll='ls -lFAx'
    # ...other OS X-specific things go here...
else if test "$OS" = "Linux"; then
    alias ll='ls -lFA'
    # ...other Linux-specific things go here...
fi
# ...generic things go here...

इसके बाद एकमात्र आवश्यकता यह है कि uname -sयह अधिकतर उसी तरह से काम करता है (यह होना चाहिए, क्योंकि दोनों प्रणालियाँ यथोचित POSIX-y हैं और Uns -s की आवश्यकता POSIX द्वारा की जाती है (धन्यवाद मार्को इसे इंगित करने के लिए ), और शेल स्क्रिप्ट ब्रांचिंग के लिए वाक्यविन्यास। एक स्ट्रिंग तुलना पर आधारित एक ही है। आप शायद अन्य मानदंडों के आधार पर भी परीक्षण कर सकते हैं; उदाहरण के लिए, आप / etc / lsb_release देख सकते हैं, जांचें कि क्या / proc / sys / कर्नेल / ostype में "Linux" है, या आप जो भी अन्य परीक्षण कर सकते हैं।


@ राफेलअह्रेन्स इट Darwin, मैंने अभी-अभी जाँच की है।
k0pernikus

@RaphaelAhrens जैसा मैंने लिखा है, मेरे पास चीजों की कोशिश करने के लिए ओएस एक्स नहीं है, इसलिए मैंने एक अपेक्षाकृत महत्वहीन विवरण पर बहुत समय बिताने के बजाय विचार दिखाने के लिए एक जंगली अनुमान लगाया, जो ओपी तुच्छ रूप से पता लगा सकता है।
एक CVn

बचाव के लिए विकिपीडिया en.wikipedia.org/wiki/Uname अगर कोई व्यक्ति विंडोज या अन्य सामान के लिए बैश चाहता है।
राफेल एहरेंस

1
अनाम -oस्विच POSIX नहीं है और कई सिस्टमों पर विफल रहता है, जैसे Solaris। -sPOSIX पर अनिवार्य है और सबसे संगत तरीका है। आईईईई एसटीडी 1003.1
मार्को

2
OSTYPEPOSIX शेल में उपलब्ध नहीं है। यह एक डिफ़ॉल्ट FreeBSD स्थापना पर उदाहरण के लिए असफल हो जायेगी और केवल में इस्तेमाल किया जा सकता .bashrcया .zshrc। यह में मज़बूती से काम नहीं करता है .profile, .aliasबजाय विशेष खोल की सुविधाओं है, जो हर सिस्टम पर उपलब्ध होने की गारंटी नहीं कर रहे हैं पर निर्भर की, आदि चूंकि हम compatibiliy के बारे में यहाँ बात कर रहे हैं, मैं सुरक्षित रास्ता तय करना सलाह चाहते हैं,।
मार्को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.