টার্মিনালে আমি কী শেলটি ব্যবহার করছি তা কীভাবে পরীক্ষা করব?


69

টার্মিনালে আমি কী শেল ব্যবহার করছি তা কীভাবে পরীক্ষা করবেন? আমি ম্যাকওএসে শেলটি কী ব্যবহার করছি?


2
@ এক্সেনোটেরাকাসাইড: কমপক্ষে ইউনিক্স.স্ট্যাকেক্সেঞ্জার / প্রশ্নস / 36/45৫/ … গাইকোসরের উত্তরটি আরও সম্পূর্ণ, সুতরাং আমি পূর্ববর্তী প্রশ্নটি বন্ধ করার পক্ষে ভোট দিয়েছি।
গিলস

1
প্রতিধ্বনি EL শেল, না?
নির্দোষ-বিশ্ব

@ নির্দোষ-বিশ্ব না, echo #SHELLএটি যথেষ্ট নয়। গাইকোসর দ্বারা উত্তরে # 3 দেখুন ।
বাসিল বাউর্ক

আমি এতটা নিশ্চিত নই যে "শেল" এর একটি সুস্পষ্ট সংজ্ঞা রয়েছে। উদাহরণস্বরূপ, আপনি দৌড়াতে পারেন xterm -e /bin/cat তবে আমি /bin/catশেল ডাকতে খুশি নই ।
বেসিল স্টারিনকিভিচ

এছাড়াও কয়েকটি শেল ( স্ক্যাসের মতো ) সিনট্যাক্সের মতো পসিক্স শেল ব্যবহার করে না।
বেসিল স্টারিনকিভিচ

উত্তর:


71

বেশিরভাগ থেকে কমপক্ষে নির্ভরযোগ্য (এবং সর্বাধিক থেকে সর্বনিম্ন "ভারী") থেকে:

  1. ps -p$$ -ocmd=। (সোলারিসে, এটি fnameপরিবর্তে হওয়া দরকার cmdOS ওএসএক্স এবং বিএসডি এর commandপরিবর্তে হওয়া উচিত cmd))
  2. চেক $BASH_VERSION, $ZSH_VERSIONঅন্যান্য শেল-নির্দিষ্ট ভেরিয়েবল, এবং।
  3. চেক $SHELL; এটি একটি সর্বশেষ অবলম্বন, কারণ এটি আপনার ডিফল্ট শেলটি নির্দিষ্ট করে এবং বর্তমান শেলটি অগত্যা নয় ।

4
$0আপনারও কি উল্লেখ করা উচিত?
মিকেল

আমি পছন্দ করি না $0কারণ এটি আরও জটিল: (1) এটি কেবলমাত্র বেসনাম হতে পারে, (2) এটি লগইন শেল হিসাবে মনোনীত করার জন্য সামনে - '' থাকতে পারে।
গাইকোসর


1
@ গেকোসৌর: সম্ভবত তাই, তবে $0এখনও তার চেয়ে বেশি কার্যকর বলে মনে হচ্ছে $SHELL: আপনি কি একমত হবেন না? sed'-' অপসারণ করতে আপনি সর্বদা এটির মাধ্যমে পাইপ করতে পারেন।
আইকনোক্লাস্ট

2
আপনি যদি চালাচ্ছেন tcsh, $tcshএবং $versionসেট হয়ে যাবে। এগুলি শেল ভেরিয়েবল, পরিবেশের ভেরিয়েবল নয়। আপনি যদি নন-টিসিএস সংস্করণটি চালাচ্ছেন তবে cshআমার মনে হয় না যে কোনও স্বতন্ত্র ভেরিয়েবল রয়েছে। এবং অবশ্যই ভেরিয়েবলগুলি পরীক্ষা করতে ব্যবহৃত সিনট্যাক্স একদিকে csh / tcsh এবং অন্যদিকে sh / ksh / bash / zsh এর মধ্যে পার্থক্য রাখে।
কিথ থম্পসন

41

আমি খুঁজে পেয়েছি যে আমার সিস্টেমে ইনস্টল করা চারটি শেলের মধ্যে নিম্নলিখিতটি কাজ করে (বাশ, ড্যাশ, জেডএস, সিএসএস):

$ ps -p $$

নিম্নলিখিতটি zsh, বাশ এবং ড্যাশগুলিতে কাজ করে তবে সিএসএসে নয়:

$ echo $0

2
মাছের উপরও কাজ করে না।
রন ই

আমি মনে করি @ জিলিয়াগ্রারের উত্তর সম্ভবত আমি আজ ব্যবহার করতে পারতাম। অন ​​মাছের %selfজায়গায় ব্যবহার করা যেতে পারে$$
স্টিভেন ডি

8

যেহেতু প্রশ্নটি ব্যবহৃত শেলটি জিজ্ঞাসা করে এবং এতে পাস হওয়া সম্ভাব্য যুক্তিগুলি সম্পর্কে কথা না বলে, এখানে এমন উপায় যা সেগুলি দেখানো এড়াতে পারে:

$ ps -o comm= -p $$
ksh93 

6

কিছু হালকা বাস্তবায়ন (অ্যান্ড্রয়েড ফোন, ব্যস্তবক্স, ইত্যাদি) সম্পর্কে একটি নোট: স্যুইচটির psজন্য সর্বদা সমর্থন রাখে না -p, তবে আপনি পছন্দ মতো কমান্ড দিয়ে অনুসন্ধানটি সম্পন্ন করতে পারেন ps | grep "^$$ "। (এই grepরেজেক্সটি অনন্যভাবে পিআইডি সনাক্ত করবে, সুতরাং কোনও মিথ্যা ধনাত্মক হবে না।


7
ps | grep $$উদাহরণস্বরূপ, যদি আপনার বর্তমান প্রক্রিয়াটি থাকে 1234এবং কোনও প্রক্রিয়া থাকে তবে এখনও মিথ্যা ইতিবাচক দিতে পারে 12345
কিথ থম্পসন

4

দুটি সত্যিই সহজ উপায় আছে:

  • PS কমান্ড ব্যবহার করে :

    ps -o comm= $$

    অথবা

    ps -h -o comm -p $$

    কোথায়:

    • -hবা =কোনও শিরোনাম না দেখানোর জন্য সমস্ত বিকল্প সমাপ্ত ।
    • -o commকেবলমাত্র প্রক্রিয়া বেসনামটি দেখানোর জন্য ( bashপরিবর্তে /bin/bash)।
    • -p <PID> পিআইডি ফর্ম তালিকা সরবরাহিত কেবলমাত্র প্রক্রিয়াজাতকরণের তালিকা করুন।
  • ব্যবহার জন্য / proc প্রক্রিয়ার তথ্য সিউডো-ফাইল সিস্টেম:

    cat /proc/$$/comm

    এই বিকল্পটি psউপরের আদেশ হিসাবে ঠিক আচরণ করে ।

    অথবা

    readlink /proc/$$/exe

    এই /proc/PID/exeফাইলটি সম্পাদন করা হচ্ছে এর লিঙ্কগুলি, যা এই ক্ষেত্রে / বিন / বাশ, / বিন / কেএসএল ইত্যাদি নির্দেশ করবে point

    কেবল শেলটির নাম পাওয়ার জন্য আপনি কেবল ব্যবহার করতে পারেন

    basename $(readlink /proc/$$/exe)

    এটি কেবলমাত্র একটি বিকল্প যা আপনি কোনও স্ক্রিপ্ট, সর্সড কোড বা টার্মিনালে থাকলেও শেল ইন্টারপ্রেটারের বাইনারি ব্যবহারের লিঙ্ক হিসাবে সর্বদা একই ফল দেয়।

    সতর্কতা আপনাকে অবশ্যই সচেতন হতে হবে যে এটি চূড়ান্ত বাইনারি দেখায়, তাই ksh কে ksh93 বা sh থেকে bash এর সাথে যুক্ত হতে পারে।

এর ব্যবহার /procসত্যই কার্যকর /proc/self, যা বর্তমান কমান্ডের পিআইডি-র সাথে লিঙ্ক করে।


3

ম্যাক (কম), সোলারিস (নাম) এবং লিনাক্স (সেন্টিমিটার) এর সাথে সামঞ্জস্যপূর্ণ অন্যান্য সমস্ত উত্তরের মিশ্রণ:

ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1

এটি আমার বর্তমান ডিরেক্টরি নাম দেয়; এছাড়াও, এর অধীনে cshএবং tcshএটি আমাকে দেয়Ambiguous output redirect.
আইকনোক্লাস্ট ০১:১

2

যদি আপনি এটি আপনার পরিবেশের ভেরিয়েবলগুলিতে সংরক্ষণ করে থাকেন তবে আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

echo $SHELL

এটি সম্ভবত আপনার লগইন শেলটির সম্পাদনযোগ্য শেলের পথ নামটি ফিরিয়ে দেবে। এটি বর্তমানে নিশ্চিত নয় যে লগইন শেলটি আপনি বর্তমানে যা চালিয়ে যাচ্ছেন তা।
কুসালানন্দ

1

চলমান শেলের পিডটি ভার by (বেশিরভাগ শাঁসে) দিয়ে থাকে।

whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
echo "$whichsh"

জেএস (হিরলম শেল) কাজ করতে ব্যাকটিক্স ব্যবহার করা।

অনেক শেলের মধ্যে সরাসরি ps -o args= -p $$কাজগুলির সরাসরি পরীক্ষা হয় তবে busybox ashএটি (সমাধান করা) এ ব্যর্থ হয়।

চেক যা $1সমান হতে হবে $$বেশিরভাগ মিথ্যা ধনাত্মককে সরিয়ে দেয়।

গত ;:ksh এবং zsh জন্য শেল চলমান রাখা ব্যবহার করা হয়।

আরও সিস্টেমে টেস্টগুলি সাহায্য করবে, আপনার পক্ষে যদি এটি কাজ না করে তবে দয়া করে একটি মন্তব্য করুন।

cshধরণের শেল কাজ করে না ।


ওএস / এক্স-এ, আমার পরীক্ষায় আমি কমপক্ষে 3 টি লাইন পাই, শেলের জন্য একটি, একটির জন্য /usr/lib/dyld, একটির জন্য /private/var/db/dyld/dyld_shared_cache_x86_64
স্টাফেন চেজেলাস

হ্যাঁ, এটি এখন কেবলমাত্র / বিন এবং / ইউএসআর /
বিনের

@ স্টাফেনচাজেলাস এখন কি আরও ভাল?

0

আমি $MYSHELLআমার শেল-অজোনস্টিকের ভবিষ্যতের পরীক্ষার জন্য সেট করেছি ~/.aliases:

unset MYSHELL
if [ -n "$ZSH_VERSION" ] && type zstyle >/dev/null 2>&1; then        # zsh
  MYSHELL=`command -v zsh`
elif [ -x "$BASH" ] && shopt -q >/dev/null 2>&1; then                # bash
  MYSHELL=`command -v bash`
elif [ -x "$shell" ] && which setenv |grep builtin >/dev/null; then  # tcsh
  echo "DANGER: this script is likely not compatible with C shells!"
  sleep 5
  setenv MYSHELL "$shell"
fi

# verify
if [ ! -x "$MYSHELL" ]; then
  MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`
  [ -x "$MYSHELL" ] || MYSHELL="${SHELL:-/bin/sh}"  # default if verify fails
fi

tcshঅধ্যায় যেহেতু এটা এত আমূল বিভিন্ন (সুতরাং সতর্কবাণী এবং পাঁচ দ্বিতীয় বিরতি) একটি POSIX ধাঁচের স্ক্রিপ্ট মধ্যে পাকানো সম্ভাবনা বিজ্ঞতার কাজ নয়। (একটির জন্য, cshস্টাইল শেলগুলি করতে পারে না 2>/dev/nullবা >&2যেমন বিখ্যাত Csh প্রোগ্রামিং হিসাবে ক্ষতিকারক অভিজাত হিসাবে বিবেচিত হয়েছে ))


-1

আপনি echo $0কোন শেল ব্যবহার করছেন <name_of_the_shell> --versionতা যাচাই করতে এবং শেলের সংস্করণ পরীক্ষা করতে আপনি কেবল কমান্ডটি ব্যবহার করতে পারেন । (যেমন। bash --version)


): স্টিভেন ডি ইতিমধ্যে এটি উল্লিখিত
রাষ্ট্রদ্রোহিতা

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