উবুন্টুতে sh এর জন্য বাশ কীভাবে ব্যবহার করবেন


14

আমি একটি বিশাল প্রোগ্রাম ইনস্টল করছি, যার rpmফাইল হিসাবে এটির সংস্থান রয়েছে । এটি এর লাইনে আটকে গেল

#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]

স্পষ্টতই, এই সিনট্যাক্স সহ রেড হ্যাট লিনাক্সে shকাজ করুন bashতবে এটি unexpected operatorউবুন্টুতে ত্রুটি দেয় ।

স্ক্রিপ্টটি প্যাকেজ bashথেকে আসার সাথে সাথে আমি স্ক্রিপ্টটিকে পরিবর্তন করতে পারি না rpm। আমি rpmপ্যাকেজটি বের করে আনতে পারি এবং এটিকে আবার সরিয়ে ফেলতে পারি তবে এর মধ্যে অনেকগুলি স্ক্রিপ্ট থাকতে পারে।

সেখানে চিকিত্সা শেল ডিফল্ট পরিবর্তন করার জন্য একটি উপায় আছে কি #!/bin/shহিসাবে bashবা অন্য কিছু, যা সব ব্যবস্থা করতে সক্ষম [অপারেটর?


5
কেবল ভুলটি হ'ল এটি ==হওয়া উচিত =। এটি, এবং যে পরিবর্তনশীল বিস্তৃতি ডাবল উদ্ধৃত করা উচিত।
Kusalananda

4
[অপারেটর নয়, একটি বিল্টিন কমান্ড যা বলা হয় test। অপ্রত্যাশিত অপারেটর ==এবং =এটি পসিক্স অনুগত নয় বলে এটি প্রতিস্থাপন করা উচিত ।
সুদৃশ্য

দ্বিতীয়টি যা ভুল তা হল $SCITEGICPERLHOMEউদ্ধৃত করা উচিত।
l0b0

12
আপনার প্রোগ্রামটির লেখকের কাছে অভিযোগ করা উচিত। যদি তারা ব্যবহার করে তবে #!/bin/shতাদের অবশ্যই নিশ্চিত করা উচিত যে তারা কেবল পসিক্স শেল বৈশিষ্ট্যই ব্যবহার করেছে, bashএক্সটেনশন নয় । এই প্রোগ্রামারটি খুব ঝিমঝিম। তাকে হয় তার কোড ঠিক করা বা ব্যবহার করা উচিত #!/bin/bash
বর্মার

অন্যান্য অনুরূপ ইস্যু নিয়ে ভাবতে থাকা লোকদের জন্য এখানে " বাশিজম " এর একটি তালিকা রয়েছে । আরো দেখুন এই প্রশ্নের
ক্যাপ্টেন ম্যান

উত্তর:


21

একাধিক প্রোগ্রাম রয়েছে যা এর ভাষা বাস্তবায়িত করে /bin/sh। উবুন্টুতে, /bin/shহ'ল ড্যাশ, যা অল্প পরিমাণে স্মৃতি ব্যবহার করার জন্য দ্রুত তৈরি করা হয়েছে এবং এটি প্রত্যাশিত ন্যূনতম চেয়ে অনেক বেশি সমর্থন করে না /bin/sh। আরএইচইএল-এ, /bin/shবাশ, যা ধীর এবং ধীরে ধীরে মেমরি ব্যবহার করে তবে এর আরও বৈশিষ্ট্য রয়েছে। এই বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল শর্তাধীন সিনট্যাক্সের ==জন্য অপারেটর [। ড্যাশ সমর্থন করে [, যা একটি প্রাথমিক শ বৈশিষ্ট্য, তবে এতে ==অপারেটর নেই যা ব্যাশ (এবং কেএসএস এবং জেডএস) এক্সটেনশন।

আপনি ব্যাশ ব্যবহার করে আপনার সিস্টেমটি স্যুইচ করতে পারেন। উবুন্টুতে /bin/shএটির প্রতীকী লিঙ্ক dash। পরিবর্তে আপনি এটি একটি প্রতীকী লিঙ্ক করতে পারেন bash। ডেবিয়ান এবং উবুন্টু (এবং ডেরিভেটিভস) এর বর্তমান সংস্করণগুলি এটিকে ড্যাশের একটি ইনস্টলেশন বিকল্প হিসাবে তৈরি করে। এটি পরিবর্তন করতে, চালান

sudo dpkg-reconfigure dash

এবং ড্যাশ হিসাবে ড্যাশ রাখতে বাশগুলিতে /bin/shস্যুইচ করতে "হ্যাঁ" উত্তর দিন ।

আপনি যেমন বাশ রাখতে পারেন /bin/shতবে এটি আপনার সিস্টেমটিকে কিছুটা ধীর করে তুলবে। এটি এমনকি অনুমেয় যে কোনও সিস্টেমের স্ক্রিপ্ট ব্যাশের সাথে সঙ্গতিপূর্ণ নয়, যদিও এটি সম্ভবত অসম্ভব যেহেতু বাশ বেশিরভাগ ড্যাশের সুপারসেট।


যেগুলির বিতরণগুলির প্রয়োগগুলির মধ্যে চয়ন করার জন্য কোনও ইন্টারফেস নেই /bin/sh, এখানে কীভাবে বাশে স্যুইচ করতে হয়।

sudo ln -s bash /bin/sh.bash
sudo mv /bin/sh.bash /bin/sh

একটি টার্মিনাল খোলা রাখুন এবং পরীক্ষা করুন যে আপনি এর পরেও কিছু shস্ক্রিপ্ট চালাতে পারেন । আপনি যদি এই আদেশটি জগাখিচুড়ি করেন তবে এটি আপনার সিস্টেমকে অকেজো করে তুলবে। (উপায় দ্বারা, কারণ আমি একাধিক কমান্ড উপরে বদলে সহজবোধ্য সুদর্শন ব্যবহৃত sudo ln -sf bash /bin/shহয় ln -sfপারমাণবিক নয়। বোঝা যাচ্ছে যে নেতারা অসম্ভাব্য ক্ষেত্রে আপনার কম্পিউটার এই অপারেশনের সময় ক্র্যাশ, আপনি রেসকিউ মিডিয়া থেকে বুট প্রয়োজন চাই এটিকে পুনরুদ্ধার করতে। বিপরীতে, mvপারমাণবিক।)

ড্যাশ হিসাবে পুনরুদ্ধার করতে /bin/sh:

sudo ln -s dash /bin/sh.dash
sudo mv /bin/sh.dash /bin/sh

মনে রাখবেন যে sh /bin/bashআপনার ডিস্ট্রিবিউশনে ডিফল্টরূপে থাকলে, ড্যাশ-এ স্যুইচ করা স্ক্রিপ্টগুলি ব্যর্থ হতে পারে, কারণ ব্যাশের ড্যাশের চেয়ে আরও অনেকগুলি বৈশিষ্ট্য রয়েছে। বাশ স্ক্রিপ্টগুলি দিয়ে শুরু হওয়া উচিত #!/bin/bash, এবং স্ক্রিপ্টগুলি দিয়ে শুরু করা #!/bin/shউচিত ব্যাশ-নির্দিষ্ট বৈশিষ্ট্য ব্যবহার করা উচিত নয়, তবে ব্যাশ সহ যে ডিস্ট্রিবিউশনগুলি সেই বিতরণে সুনির্দিষ্ট স্ক্রিপ্টগুলিতে /bin/shব্যাশ-নির্দিষ্ট বৈশিষ্ট্যগুলি ব্যবহার করতে পারে #!/bin/sh(এটি ঠিক আছে যতক্ষণ না ব্যবহারকারীদের কোনও প্রত্যাশা নেই ড্যাশ হিসাবে স্যুইচ করতে পারে /bin/shএবং এই স্ক্রিপ্টগুলি অন্য বিতরণে কাজ করে এমন কোনও প্রত্যাশা নেই।


আমার এত নম্র নয়, /bin/shবাশ যখন কোনও স্ক্রিপ্ট ব্যর্থ হয় তবে এটি সিস্টেমে (স্ক্রিপ্টের প্যাকেজ) বা বাশের- shমোডে একটি বাগ । স্টিফেন যেমন বলেছে, সিস্টেম স্পষ্ট /bin/shকরে বাশের কাছে ফিরে যেতে সেট করে dpkg-reconfigure। এই বিষয়ে উবুন্টু উইকিতে এটি একটি সম্ভাবনা হিসাবেও উল্লেখ করা হয়েছে: wiki.ubuntu.com/DashAsBinSh
ilkkachu

5
@ ইলক্কাচু হ্যাঁ, যদি কোনও স্ক্রিপ্ট ব্যস হয় তবে /bin/shএটি একটি বাগ। তবে বাগগুলি ঘটে। যদি আপনি সক্ষম হন এবং এই জাতীয় বাগগুলি নির্ণয় করতে ইচ্ছুক না হন তবে আমি অন্যান্য ডিফল্টর সাথে লেগে থাকার পরামর্শ দিচ্ছি কারণ অন্যান্য লোকেরা এটি আপনার জন্য পরীক্ষা করেছে। আমি ড্যাশ ব্যবহার করেছিলাম যেমন /bin/shএটি ডিবিয়ানকে আনুষ্ঠানিকভাবে সমর্থিত হয়েছিল, তবে এটি এমন একটি ঝুঁকি ছিল যা আমি জেনেছিলাম যে আমি যদি কিছু ঘটে তবে তা মোকাবিলা করতে সক্ষম হব।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

নোট করুন যে ম্যানুয়ালি ওভাররাইড করা প্রতীকগুলি debconfপরের বারে যা কিছু কনফিগারেশন সংরক্ষণ করা হবে dashতা আপডেট করা হবে; স্বীকার করে যে ডেবিয়ান স্থিতিশীল চলমান সিস্টেমগুলির জন্য এটি প্রায়শই ঘটবে না (যদি মোটেও, প্রদত্ত প্রকাশে)।
স্টিফেন কিট

36

( ডিফল্ট পরিবর্তে , এর পরিবর্তে ) স্যুইচ shকরতে , পুনরায় কনফিগার করুন (হ্যাঁ, এটি কিছুটা স্ব-স্বজ্ঞাত)bashdashdash

sudo dpkg-reconfigure dash

এটি আপনাকে dashডিফল্ট সিস্টেম শেল হতে চাইবে কিনা তা জিজ্ঞাসা করবে ; "না" ( Tabতারপরে Enter) উত্তর দিন এবং এর bashপরিবর্তে ডিফল্ট হয়ে যাবে ( অর্থাত্‍ /bin/sh ইঙ্গিত করবে /bin/bash)।


1
আপনার সমাধানটি প্রকৃতপক্ষে সবচেয়ে যুক্তিসঙ্গত, তবে সমস্যাটি বিশদ বিবরণের কারণে আমি অন্য উত্তরটি গ্রহণ করেছি। কোন অসুবিধার জন্য দুঃখিত.
গুগলবট

@ গুগলবটকে ক্ষমা চাওয়ার দরকার নেই, গৃহীত উত্তরটি বেছে নেওয়া প্রশ্নকারীর সুযোগ্য। এবং আমি এটি থেকে একটি সোনার ব্যাজ পেয়েছি ;-)।
স্টিফেন কিট 9'18
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.