আমার স্ক্রিপ্ট কীভাবে এটি নির্ধারণ করতে পারে যে এটি বাশ বা ড্যাশ দ্বারা চালিত হচ্ছে?


13

আমি দুটি ভিন্ন সিস্টেমে একটি নতুন ওনারিক ইনস্টল (অর্থাত্ আপগ্রেড নয়) চালাচ্ছি এবং আপাতদৃষ্টিতে সম্পর্কিত সমস্যার একই সেটটিতে চলেছি।

গুচ্ছটির সবচেয়ে হতাশা হ'ল, যখন আমি ম্যাক ওএস এক্স থেকে আমার সাথে চালিত। প্রোফাইল এবং .বাশার্কটি ব্যবহার করি তখন লাইটডিএম এর মাধ্যমে এক্সে লগ ইন করে সাথে সাথে আমাকে লগ আউট করে। আমি বিশ্বাস করি এটি এই কারণে ঘটেছিল যে "/ bin / sh" চালানোর সময় এটি / বিন / ড্যাশ হিসাবে আচরণ করে তবে এখনও / শেল ভেরিয়েবলটি / বিন / ব্যাশে সেট থাকে।

বহির্পাতন

আমার একটা বিশাল আছে .bashrc। আপনি এটি দেখতে চাইলে এখানে এটি দেখতে পারেন, তবে এটির বিষয়বস্তু সম্ভবত প্রাসঙ্গিক নয়, এটি ব্যাসিজমে ভরা এবং সত্য যে এটি এক্সটারমের ভিতরে বা ভার্চুয়াল কনসোলটিতে কোনও ত্রুটি নিয়ে কাজ করে না aside

আমার .profileচেহারাটি এর মতো (সংক্ষেপে):

case $SHELL in 
*bash*)
    if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
        . $HOME/.bashrc
    fi
    ;;
esac

আমি যদি লাইটডিএম এর মাধ্যমে এক্স-এ লগ ইন করার চেষ্টা করি তবে তা আমাকে সঙ্গে সঙ্গে লগ আউট করে দেবে। .xsession-errorsআমার .bashrc সম্পর্কিত ক্ষেত্রে ত্রুটি পেয়েছি যা দেখতে (সংক্ষেপে বর্ণিত):

/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found

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

যাইহোক, আমি আবিষ্কার করেছি যে যদি আমি চালানোর /bin/sh -l, আমি কি ত্রুটি পেতে। এখানে একটি উদাহরণ সেশন রয়েছে (দ্রষ্টব্য: ব্যাশ প্রম্পটটি আমি সরল করেছি bash>এবং sh প্রম্পটটি কেবলমাত্র $):

bash> echo $SHELL
/bin/bash
bash> echo $BASH_VERSION
4.2.10(1)-release
bash> /bin/sh -l
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
$ echo $SHELL
/bin/bash
$ echo $BASH_VERSION

$

প্রশ্ন 1: কেন এমন হচ্ছে?

আমি বুঝতে পারি যে / বিন / শ এখন বাশের পরিবর্তে ড্যাশকে নির্দেশ করে , তবে যদি এটি সত্য হয় তবে $SHELLএখনও কেন ফিরে আসছেন /bin/bash?

প্রশ্ন 2: আমি এটিকে ঘিরে কাজ করতে কী করতে পারি?

এখানে কাজ করার একটি উপায় আছে কি? আমি আমার প্রোফাইলটি লোড করে রাখতে চাই .বাশিআরসি যাতে আমি লগইন এবং নন-লগইন উভয় শেলগুলিতে একই পরিবেশ পাই তবে স্পষ্টতই আমি কেবল এটি ব্যাশ নিজেই লোড করতে চাই, / বিন / শ ব্যাস হিসাবে মাস্ক্রেডিং নয়।

আপনি উপরের $ BASH_VERSION ভেরিয়েবলের সামগ্রীতে পার্থক্যটি লক্ষ্য করেছেন noticed আমি আমার। প্রোফাইলটিকে এই জাতীয় কিছুতে মুড়িয়ে দেওয়ার চেষ্টা করেছি:

if [ -n $BASH_VERSION ]; then
    # the rest of my .profile as above
fi

-nপরীক্ষা উপরে সেশনে সত্য ফিরে উচিত শুধুমাত্র যদি স্ট্রিং এর দৈর্ঘ্য নন-জিরো, কিন্তু, যদিও, আমি চলছি অধীনে /bin/sh -lএটা $ BASH_VERSION জন্য একটি খালি স্ট্রিং, যখন এটা ভালো আমার .profile মধ্যে অন্তর্ভুক্ত ফেরৎ , এটি পরীক্ষায় পাস! এগুলি আমার .bashrc উত্স করতে এগিয়ে যায় এবং আমাকে আগের মতো ত্রুটি দেয়।

এখন আমি সত্যিই বিভ্রান্ত।


নোটটিও মান রাখার বিষয়টি dash -lদেখায় । $SHELL/bin/bash
স্কট সিভেরেন্স

3
$SHELL/etc/passwd(বা getent passwd) এর শেষ ক্ষেত্র যা কিছু তা-ই ।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ ডেনিসউইলিইমসন আপনাকে ধন্যবাদ , সঠিক উত্তরটি খুঁজতে আমার এটির জানা দরকার।
মিকাহ আর লেডবেটার

আপনি এটা ভুল করছেন. আপনার নন-ব্যাশ-নির্দিষ্ট পরিবেশ ~/.profile, বাশ-নির্দিষ্ট জিনিসগুলিতে রাখা উচিত ~/.bashrcএবং ~/.bash_profileউভয় উত্স থাকতে পারে ।
nyuszika7h

উত্তর:


12

আপনার পক্ষে কাজের $BASH_VERSIONফাঁকা থাকা তথ্যটি আপনি তৈরি করতে পারেন dash:

if [ "$BASH_VERSION" = '' ]; then
    echo "This is dash."
else
    echo "This is bash."
fi

2
"এক্স" কৌশলটি প্রত্নতাত্ত্বিক এবং কেবল প্রাচীন শেলগুলিতে প্রয়োজন। ব্যবহারif [ "$BASH_VERSION" = '' ]
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ ডেনিস উইলিয়ামসন: ধন্যবাদ আমি ভেবেছিলাম আপনার কৌশলটি বাশের সাথে সুনির্দিষ্ট, তবে আমি কেবল এটি ড্যাশে বিশ্রাম দিয়েছিলাম এবং এটি কার্যকর হয়েছিল। আমি আমার উত্তর সম্পাদনা করেছি।
স্কট সিরিয়েন্স

বা শুধু ব্যবহার করুন-n , বা কিছুই । (+1, যদিও = ''নিখুঁতভাবে ভাল কাজ করে))
এলিয়াহ কাগন

5

ব্যবহারের জন্য আপনাকে কেবল ভেরিয়েবলের উদ্ধৃতি BASH_VERSIONব্যবহার করতে হবে-n

if [ -n "$BASH_VERSION" ];then
 echo "this is bash"; 
else 
 echo "this is dash";
fi

1
যেহেতু [ "$EMPTY_STRING" ]মিথ্যা মূল্যায়ন করে, আপনার এমনকি এটিরও দরকার নেই -n। আপনাকে কেবল পরিবর্তনশীলটি উদ্ধৃত করতে হবে।
jeberle

2

ব্যবহারের /proc/[PID]/cmdlineকি স্ক্রিপ্ট এটা কি রয়েছে সঙ্গে এবং পরীক্ষা চালানো হচ্ছে দেখতে। $$পরিবর্তনশীল আমাদের চলমান শেলের PID, দেব। এইভাবে আমরা এটির মতো স্ক্রিপ্ট তৈরি করতে পারি,

#!/bin/bash
if grep -q 'bash' /proc/$$/cmdline ;
then
    echo "This is bash"
else
    echo "This is some other shell"
fi

এখানে একই স্ক্রিপ্টের একটি পরীক্ষা:

$> bash test_script.sh                                                                                                
This is bash
$> dash test_script.sh                                                                                                
This is some other shell

এটি ম্যাকটিতে কাজ করবে না। AS BASH_VERSION পরীক্ষা করুন।
অস্টিন বার্ক

2
@ অস্টিনবার্ক এটি ম্যাক কাজ করার প্রয়োজন নেই। এটি আস্ক উবুন্টু।
দ্য ওয়ান্ডারার

@ জ্যাকারি 1 ওহ, এটি ঘৃণা করুন, আমি মনোযোগ দিচ্ছিলাম না:,)
অস্টিন বার্ক

আপনি যা চান তা থেকে আমি এটিকে সম্পাদনা করতে চাই না, তবে আমি এই পদ্ধতির সীমাবদ্ধতা উল্লেখ করার পরামর্শ দিই। bashএর নামে বাশের দরকার নেই ; bashএক্সিকিউটিভের পক্ষে অন্য একটি নাম সহ একটি সিমলিংকের মাধ্যমে চালানো অস্বাভাবিক নয় । সাধারণত কেউ এখনও সেই বাশটিকে বিবেচনা করতে চায়। এছাড়াও, প্যাটার্ন হয় মিলেছে যে কোন জায়গায় যে/proc/$$/cmdline , যা সংশোধন করা সম্ভব হওয়া উচিত, কিন্তু মনে রাখবেন যে আর্গুমেন্ট cmdlineনাল-অক্ষর সীমায়িত হয়। grep -qE '(^|/)bash$'মনে হয় এটি কাজ করা উচিত তবে কোনও যুক্তি থাকলে একটি মিথ্যা ইতিবাচক দেয় bash
এলিয়াহ

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