শেল কনফিগার স্ক্রিপ্টগুলিতে, আমি কীভাবে জিএনইউর তুলনায় বিএসডি-তে কোর্টিলের মধ্যে পার্থক্য বিবেচনা করতে পারি?


9

এই মাস অবধি, আমার শেল কনফিগারেশনগুলি বেশ সহজ ছিল (কেবলমাত্র একটি .bashrcবা .bash_profileকিছু এলিয়াসের সাথে মূলত), তবে আমি এটি রিফ্যাক্টর করছি তাই আমি zsh, এবং ব্যাশ ব্যবহার করছি কিনা তার উপর নির্ভর করে আমি আলাদা আচরণ পেতে পারি। তারা প্রথমে একটি জেনেরিক শেল কনফিগারেশন ফাইল উত্স করে যা কিছুতেই কাজ করা উচিত, তারপরে নির্দিষ্ট শেলটি ব্যবহার করার জন্য বিশেষীকরণ করুন (আমি এটির সাথে সিলেট করি)।

আমি আজ lsকাজ বন্ধ করে দিয়ে অবাক হয়েছি । দেখা গেল যে রিফ্যাক্টরিংয়ের সময় একটি উলাম .bashrcছিল

alias ls='ls --color=always'

lsওএসএক্স-এ টার্মিনাল-এ বাশ দেওয়ার জন্য জিনিসগুলি ভঙ্গ করছিল । একবার আমি দেখেছি বিএসডি রঙের জন্য lsপছন্দ করে -Gতবে জিএনইউ (বা যা কিছু উবুন্টুতে ছিল) পছন্দ করে --color, এটি পরিষ্কার যে বেশ কয়েকটি বিকল্পের মধ্যে ভিন্নতা রয়েছে।

আমার প্রশ্ন, বিএসডি এবং জিএনইউ কোর্টিলসের মধ্যে বিকল্পগুলির মধ্যে পার্থক্যের জন্য অ্যাকাউন্ট করার সর্বোত্তম উপায় কী? ifকোনটি ওএস ব্যবহার করা হচ্ছে তা দেখার জন্য এবং সঠিক আচরণ প্রয়োগ করার জন্য আমাকে ব্লকগুলিতে একটি এনভির ভেরিয়েবলের পরীক্ষা করা উচিত ? অথবা প্রতিটি ওএসের জন্য পৃথক কনফিগারেশন ফাইল তৈরি করা কি আরও বেশি অর্থবোধ করে?

যদিও এই প্রশ্নের উত্তর সাপেক্ষিক হতে পারে তবে মনে হয় বিএসডি এবং জিএনইউ কোর্টিলের মধ্যে পার্থক্যের সুযোগ রয়েছে এবং বেশিরভাগ * নিক্সে জেনেরিক কনফিগার ব্যবহারের উপযোগী করার জন্য এগুলি সম্পর্কে কাজ করার কৌশলগুলি মোটামুটি উদ্দেশ্যমূলক হবে।


শেল পরিবর্তন করা কোনও কিছুই ঠিক করবে না এবং এটির ls -cথেকে পৃথক ls --color। আপনার প্রশ্নটি ঠিক করার জন্য সম্পাদনা করেছেন।
মিকেল 18'14

উত্তর:


9

বিভিন্ন অপারেটিং সিস্টেমগুলিকে সমর্থন করে এমন স্ক্রিপ্টগুলি লেখার একমাত্র নির্ভরযোগ্য উপায় হ'ল কেবল পসিক্স দ্বারা সংজ্ঞায়িত বৈশিষ্ট্যগুলি ব্যবহার করা।

আপনার ব্যক্তিগত শেল কনফিগারেশনের মতো জিনিসের জন্য আপনি হ্যাকগুলি ব্যবহার করতে পারেন যা আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে উপযুক্ত। নীচের মতো কিছু কুৎসিত, তবে লক্ষ্যটি অর্জন করবে।

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

আমি বিভিন্ন পদ্ধতি নিয়ে ঘুরে বেড়াচ্ছি, এবং আমার মনে হয় আপনার "কুরুচিপূর্ণ" সমাধানটি বেশ ভাল এবং এমনকি কুৎসিতও নয়। এটি দেখা যাচ্ছে যে, এর আগে আমি বিকল্পগুলির বিকল্পগুলির সাথে মেলে না। কারণ আমি পোর্টগুলি থেকে জিএনইউ কোর্টিল ব্যবহার করছিলাম। এটি উদাহরণ is OSTYPE এ 'যদি' করা কেন পছন্দসই ফলাফল দিতে ব্যর্থ হতে পারে।
গোলকধাঁধা

জিএনইউ কোর্টিলগুলি উপস্থিত না থাকলে "তবে যদি এলএস - রূপান্তর" থেকে আগত ত্রুটিটি দমন করার কোনও উপায় আছে (তবে তবুও কোর্টিলগুলি পরীক্ষা করতে সক্ষম হবে)?
গোলকধাঁধা

ওহ, ত্রুটিটি দমন করার বিষয়ে কিছুই নয়। আমি গ্রেডে পাইপিংয়ের আগে কেবল স্টাডারকে / dev / null এ পুনঃনির্দেশ করি এবং এটি আমার পছন্দ মতো কাজ করে।
গোলকধাঁধা

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
}

এটি অনেকটা ক্লিনার, যদি না আপনি উদাহরণস্বরূপ GNU ls সহ 0.1% সিস্টেমে থাকেন তবে GNU বিড়ালটি ইনস্টল করা হয়নি (সম্ভবত এটি সত্যিই পুরানো এবং এগুলির ফাইল্টিল রয়েছে তবে টেক্সটুলগুলি নেই)। আমি lsআপনার প্রেরণের পরিবর্তে আপনার প্রেরণকারীগুলিতে ব্যবহার করার জন্য প্রলুব্ধ হব cat, বিশেষত যেহেতু আপনার কোনও এলিয়াস জড়িত নয় cat
মাইকেল

এছাড়াও, --color=autoআপনার দ্বিতীয় এবং তৃতীয় এলিয়াসগুলির প্রয়োজন হবে না , যেহেতু প্রথম উপনামটি সেই বিকল্পটি যুক্ত করে ls
মাইকেল

1
@ মাইকেল হু, আমি পুরোপুরি বুঝতে পারি নি যে aliasএটি পুনরাবৃত্তি হয়েছিল। এটি আমাকে উদাহরণটিকে আরও সহজ করে তুলতে দেয়।
মাইকেল ক্রোপাট

অনেক ভাল. :-)
মাইকেল

0

আপনার প্রশ্নের সরাসরি উত্তর নয়, তবে আমার কাছে .bashrc- এ অতিরিক্ত জটিলতার চেয়ে এই জাতীয় জিনিসগুলি হ্যান্ডেল করার জন্য মোড়ক স্ক্রিপ্ট রয়েছে উদাহরণস্বরূপ এখানে আমার এল স্ক্রিপ্ট যা এখানে আপনার কেসকে একটি ক্রস প্ল্যাটফর্ম পদ্ধতিতে পরিচালনা করে:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.