টার্মিনালে আমি কী শেল ব্যবহার করছি তা কীভাবে পরীক্ষা করবেন? আমি ম্যাকওএসে শেলটি কী ব্যবহার করছি?
echo #SHELL
এটি যথেষ্ট নয়। গাইকোসর দ্বারা উত্তরে # 3 দেখুন ।
xterm -e /bin/cat
তবে আমি /bin/cat
শেল ডাকতে খুশি নই ।
টার্মিনালে আমি কী শেল ব্যবহার করছি তা কীভাবে পরীক্ষা করবেন? আমি ম্যাকওএসে শেলটি কী ব্যবহার করছি?
echo #SHELL
এটি যথেষ্ট নয়। গাইকোসর দ্বারা উত্তরে # 3 দেখুন ।
xterm -e /bin/cat
তবে আমি /bin/cat
শেল ডাকতে খুশি নই ।
উত্তর:
বেশিরভাগ থেকে কমপক্ষে নির্ভরযোগ্য (এবং সর্বাধিক থেকে সর্বনিম্ন "ভারী") থেকে:
ps -p$$ -ocmd=
। (সোলারিসে, এটি fname
পরিবর্তে হওয়া দরকার cmd
OS ওএসএক্স এবং বিএসডি এর command
পরিবর্তে হওয়া উচিত cmd
))$BASH_VERSION
, $ZSH_VERSION
অন্যান্য শেল-নির্দিষ্ট ভেরিয়েবল, এবং।$SHELL
; এটি একটি সর্বশেষ অবলম্বন, কারণ এটি আপনার ডিফল্ট শেলটি নির্দিষ্ট করে এবং বর্তমান শেলটি অগত্যা নয় ।$0
আপনারও কি উল্লেখ করা উচিত?
$0
কারণ এটি আরও জটিল: (1) এটি কেবলমাত্র বেসনাম হতে পারে, (2) এটি লগইন শেল হিসাবে মনোনীত করার জন্য সামনে - '' থাকতে পারে।
ps -p$$ -ocmd=""
$0
এখনও তার চেয়ে বেশি কার্যকর বলে মনে হচ্ছে $SHELL
: আপনি কি একমত হবেন না? sed
'-' অপসারণ করতে আপনি সর্বদা এটির মাধ্যমে পাইপ করতে পারেন।
tcsh
, $tcsh
এবং $version
সেট হয়ে যাবে। এগুলি শেল ভেরিয়েবল, পরিবেশের ভেরিয়েবল নয়। আপনি যদি নন-টিসিএস সংস্করণটি চালাচ্ছেন তবে csh
আমার মনে হয় না যে কোনও স্বতন্ত্র ভেরিয়েবল রয়েছে। এবং অবশ্যই ভেরিয়েবলগুলি পরীক্ষা করতে ব্যবহৃত সিনট্যাক্স একদিকে csh / tcsh এবং অন্যদিকে sh / ksh / bash / zsh এর মধ্যে পার্থক্য রাখে।
আমি খুঁজে পেয়েছি যে আমার সিস্টেমে ইনস্টল করা চারটি শেলের মধ্যে নিম্নলিখিতটি কাজ করে (বাশ, ড্যাশ, জেডএস, সিএসএস):
$ ps -p $$
নিম্নলিখিতটি zsh, বাশ এবং ড্যাশগুলিতে কাজ করে তবে সিএসএসে নয়:
$ echo $0
%self
জায়গায় ব্যবহার করা যেতে পারে$$
কিছু হালকা বাস্তবায়ন (অ্যান্ড্রয়েড ফোন, ব্যস্তবক্স, ইত্যাদি) সম্পর্কে একটি নোট: স্যুইচটির ps
জন্য সর্বদা সমর্থন রাখে না -p
, তবে আপনি পছন্দ মতো কমান্ড দিয়ে অনুসন্ধানটি সম্পন্ন করতে পারেন ps | grep "^$$ "
। (এই grep
রেজেক্সটি অনন্যভাবে পিআইডি সনাক্ত করবে, সুতরাং কোনও মিথ্যা ধনাত্মক হবে না।
ps | grep $$
উদাহরণস্বরূপ, যদি আপনার বর্তমান প্রক্রিয়াটি থাকে 1234
এবং কোনও প্রক্রিয়া থাকে তবে এখনও মিথ্যা ইতিবাচক দিতে পারে 12345
।
দুটি সত্যিই সহজ উপায় আছে:
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
, যা বর্তমান কমান্ডের পিআইডি-র সাথে লিঙ্ক করে।
ম্যাক (কম), সোলারিস (নাম) এবং লিনাক্স (সেন্টিমিটার) এর সাথে সামঞ্জস্যপূর্ণ অন্যান্য সমস্ত উত্তরের মিশ্রণ:
ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1
csh
এবং tcsh
এটি আমাকে দেয়Ambiguous output redirect.
যদি আপনি এটি আপনার পরিবেশের ভেরিয়েবলগুলিতে সংরক্ষণ করে থাকেন তবে আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:
echo $SHELL
চলমান শেলের পিডটি ভার by (বেশিরভাগ শাঁসে) দিয়ে থাকে।
whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
echo "$whichsh"
জেএস (হিরলম শেল) কাজ করতে ব্যাকটিক্স ব্যবহার করা।
অনেক শেলের মধ্যে সরাসরি ps -o args= -p $$
কাজগুলির সরাসরি পরীক্ষা হয় তবে busybox ash
এটি (সমাধান করা) এ ব্যর্থ হয়।
চেক যা $1
সমান হতে হবে $$
বেশিরভাগ মিথ্যা ধনাত্মককে সরিয়ে দেয়।
গত ;:
ksh এবং zsh জন্য শেল চলমান রাখা ব্যবহার করা হয়।
আরও সিস্টেমে টেস্টগুলি সাহায্য করবে, আপনার পক্ষে যদি এটি কাজ না করে তবে দয়া করে একটি মন্তব্য করুন।
csh
ধরণের শেল কাজ করে না ।
/usr/lib/dyld
, একটির জন্য /private/var/db/dyld/dyld_shared_cache_x86_64
।
আমি $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 প্রোগ্রামিং হিসাবে ক্ষতিকারক অভিজাত হিসাবে বিবেচিত হয়েছে ))
আপনি echo $0
কোন শেল ব্যবহার করছেন <name_of_the_shell> --version
তা যাচাই করতে এবং শেলের সংস্করণ পরীক্ষা করতে আপনি কেবল কমান্ডটি ব্যবহার করতে পারেন । (যেমন। bash --version
)