शेल कॉन्फिगरेशन स्क्रिप्ट्स में, मैं GNU की तुलना में BSD पर कोरुटिल्स के बीच अंतर का हिसाब कैसे लगा सकता हूँ?


9

इस महीने तक, मेरा शेल कॉन्फिग काफी सरल रहा है ( मुख्य रूप से .bashrcया .bash_profileकुछ उपनामों के साथ), लेकिन मैं इसे रिफैक्ट कर रहा हूं, इसलिए मैं अलग-अलग व्यवहार कर सकता हूं, जो इस बात पर निर्भर करता है कि मैं zsh और bash का उपयोग कर रहा हूं या नहीं। वे पहले एक जेनेरिक शेल कॉन्‍फ़िगर फ़ाइल का स्रोत बनाते हैं, जो कुछ भी काम करना चाहिए, फिर उपयोग किए जा रहे विशिष्ट शेल के लिए विशेषज्ञ (मैं इस के लिए सहानुभूति रखता हूं)।

मुझे आज आश्चर्य हुआ जब मैंने lsकाम करना बंद कर दिया। यह पता चला कि रिफैक्टरिंग के दौरान .bashrc, एक उपनाम था

alias ls='ls --color=always'

lsOSX में टर्मिनल पर बैश के लिए चीजें तोड़ रहा था । एक बार मैंने देखा कि बीएसडी lsको -Gरंग पसंद है, लेकिन जीएनयू (या जो भी उबंटू में था) पसंद करता है --color, यह स्पष्ट था कि काफी कुछ विकल्प अलग हैं।

मेरा सवाल यह है कि बीएसडी और जीएनयू कोरयूटिल्स के बीच विकल्पों में अंतर के लिए सबसे अच्छा तरीका क्या है? क्या मुझे ifयह देखने के लिए कि क्या उपयोग किया जा रहा है और सही व्यवहार को लागू करने के लिए ब्लॉकों में एक एनवी चर के लिए परीक्षण करना चाहिए ? या क्या यह प्रत्येक ओएस के लिए अलग-अलग कॉन्फिग फाइल बनाने के लिए अधिक समझ में आता है?

हालांकि इन सवालों के जवाब व्यक्तिपरक हो सकते हैं, ऐसा लगता है कि बीएसडी और जीएनयू कोरुटिल्स के बीच मतभेदों की गुंजाइश का एक हिस्सा है और इन चारों ओर काम करने के लिए रणनीतियों को बनाने के लिए सबसे सामान्य रूप से उपयोग करने के लिए एक सामान्य विन्यास काफी अच्छा होगा।


गोले बदलने से कुछ ठीक नहीं होगा, और इससे ls -cअलग है ls --color। अपने प्रश्न को ठीक करने के लिए संपादित किया।
मिकेल

जवाबों:


9

विभिन्न ऑपरेटिंग सिस्टम का समर्थन करने वाली स्क्रिप्ट लिखने का एकमात्र विश्वसनीय तरीका केवल उन सुविधाओं का उपयोग करना है जो पोसिक्स द्वारा परिभाषित हैं।

आपके व्यक्तिगत शेल कॉन्फ़िगरेशन जैसी चीजों के लिए, आप उन हैक का उपयोग कर सकते हैं जो आपके विशिष्ट उपयोग के मामले में फिट होते हैं। निम्नलिखित की तरह कुछ बदसूरत है, लेकिन लक्ष्य को पूरा करेगा।

if ls --version 2>/dev/null | grep -q 'coreutils'; then
    alias ls='ls --color=always'
else
    alias ls='ls -G'
fi

मैं विभिन्न तरीकों के साथ खेल रहा हूं, और मुझे लगता है कि आपका "बदसूरत" समाधान बहुत अच्छा है और वह भी बदसूरत नहीं है। जैसा कि यह पता चला है, मैंने पहले ls के लिए विकल्पों में बेमेल पर ध्यान नहीं दिया था क्योंकि मैं पोर्ट्स से GNU कोरुटिल्स का उपयोग कर रहा था। यह एक उदाहरण है कि $ OSTYPE पर 'अगर' करना वांछित परिणाम देने में विफल हो सकता है।
भूलभुलैया

क्या जीएनयू कोरुटिल्स मौजूद नहीं हैं (लेकिन फिर भी कोरुटिल्स के लिए परीक्षण करने में सक्षम हैं) "क्या अगर एलएस --version" से आने वाली त्रुटि को दबाने का एक तरीका है?
भूलभुलैया

ओह, त्रुटि को दबाने के बारे में कभी नहीं। मैं बस grep को पाइप करने से पहले / dev / null को stderr रिडायरेक्ट करता हूं और जैसा मैं चाहता हूं, यह काम करता है।
भूलभुलैया

3
coreutilsस्पष्ट रूप से देखने के बजाय , क्यों न केवल यह परीक्षण करें कि रंग ध्वज कार्य करता है, जैसे if ls --color=auto -d / >/dev/null 2>&1; then ...
मिकेल

@ मिकेल यदि आप केवल रंग के बारे में चिंतित हैं (उदाहरण में), तो यह ठीक है। यदि आप अन्य सुविधाओं के बारे में भी परवाह करते हैं, तो कोरुटिल्स की जाँच उपयोगी है।
जोर्डनम

3

साथ कोड कचरा ifबयान के प्रकार पर एक स्विच प्रदर्शन करने के लिए coreutils काम करता है, लेकिन अलग-अलग प्रकार से निपटने के लिए स्वच्छ प्रोग्रामिंग समाधान उपयोग करने के लिए है बहुरूपता । चूंकि यह बैश है, हमारे पास प्रति से अधिक बहुरूपता नहीं है, लेकिन मैं इसे नकली करने के तरीके के साथ खिलवाड़ कर रहा हूं। केवल आवश्यकता यह है कि आपकी .bashrcफ़ाइल आदि को कार्यों में व्यवस्थित किया जाए।

पहले मैं कोरुटिल्स प्लेटफ़ॉर्म प्रकार के लिए एक परीक्षण बनाता हूं :

get_coreutils_platform() {
    local ls_version="$(ls --version 2>/dev/null)"
    if [[ "$ls_version" == *"GNU coreutils"* ]]; then
        echo gnu
    else
        echo bsd
    fi
}

फिर हम टाइप के आधार पर प्रेषण कर सकते हैं:

platform=$(get_coreutils_platform)
define_standard_aliases_$platform
configure_shell_vars_$platform

यहाँ बीएसडी कार्यान्वयन है:

define_standard_aliases_bsd() {
    define_standard_aliases
}

configure_shell_vars_bsd() {
    configure_shell_vars
    export CLICOLOR=1
}

(ध्यान दें कि हम CLICOLORएक का उपयोग करने के बजाय रंगों को चालू करने के लिए चर का उपयोग करते हैं alias, जो एक लिटलर क्लीनर लगता है)

और ग्नू इम्बैलेंसेशन:

define_standard_aliases_gnu() {
    define_standard_aliases
    alias ls='ls --color=auto'
}

configure_shell_vars_gnu() {
    configure_shell_vars
}

पूर्णता के लिए, यहां "सार आधार" का एक नमूना कार्यान्वयन है:

define_standard_aliases() {
    alias ll='ls -l'
    alias l.='ls -d .*'
}

configure_shell_vars() {
    export EDITOR=vim
}

यह बहुत साफ है, जब तक कि आप जीएनयू एलएस के साथ 0.1% सिस्टम पर नहीं हैं लेकिन जीएनयू कैट इंस्टॉल नहीं किया गया है (शायद यह वास्तव में पुराना है और उनके पास फाइल्यूटिल्स हैं लेकिन टेक्सट्यूटिल्स नहीं हैं)। मुझे lsआपके डिस्पैचर में उपयोग करने के लिए लुभाया जाएगा cat, खासकर जब से कि आपके किसी भी अलायस में शामिल न हों cat
मिकेल

इसके अलावा, आपको --color=autoअपने दूसरे और तीसरे उपनाम में ज़रूरत नहीं होनी चाहिए , क्योंकि पहला उपनाम उस विकल्प को जोड़ता है ls
मिकेल

1
@ मिकेल वो, मुझे पूरी तरह से एहसास नहीं था कि aliasपुनरावर्ती था। इससे मैं उदाहरण को और सरल बना सकता हूँ।
माइकल क्रोपट

काफी बेहतर। :-)
मिकेल

0

आपके प्रश्न का सीधा उत्तर नहीं है, लेकिन मेरे पास .bashrc में अतिरिक्त जटिलता के बजाय इस तरह की चीजों को संभालने के लिए आवरण लिपियाँ हैं। उदाहरण के लिए यहाँ मेरी l स्क्रिप्ट है जो आपके केस को यहाँ एक क्रॉस प्लेटफ़ॉर्म तरीके से संभालती है:

http://www.pixelbeat.org/scripts/l

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.