परीक्षण कैसे करें कि मैं एक टर्मिनल में किस शेल का उपयोग कर रहा हूं?


69

टर्मिनल में मैं किस शेल का उपयोग कर रहा हूं, इसकी जांच कैसे करें? मैं MacOS में किस शेल का उपयोग कर रहा हूं?


2
@xenoterracide: कम से कम unix.stackexchange.com/questions/3645/… । geekosaur का उत्तर अधिक पूर्ण है, इसलिए मैंने पहले वाले प्रश्न को बंद करने के लिए मतदान किया।
गाइल्स

1
इको $ शेल, नहीं?
मासूम-दुनिया

@ निर्दोष-संसार नहीं, echo #SHELLबिल्कुल नहीं है। देखें # 3 उत्तर में geekosaur द्वारा
बेसिल बॉर्क

मुझे इतना यकीन नहीं है कि "शेल" का एक अच्छी तरह से परिभाषित अर्थ है। उदाहरण के लिए, आप चला सकते हैं xterm -e /bin/cat लेकिन मैं /bin/catएक शेल को कॉल करके खुश नहीं हूं ।
बेसिल स्टारीनेवविच

इसके अलावा कुछ गोले (जैसे scsh ) POSIX खोल का उपयोग सिंटैक्स की तरह न करें।
बेसिल स्टारीनेवविच 10

जवाबों:


71

कई तरीके, सबसे कम से कम विश्वसनीय (और सबसे कम से कम "भारी"):

  1. ps -p$$ -ocmd=। (सोलारिस पर, fnameइसके बजाय cmdOSX पर और BSD पर commandइसके बजाय होना चाहिए cmd।)
  2. के लिए जाँच करें $BASH_VERSION, $ZSH_VERSIONअन्य खोल विशिष्ट चर, और।
  3. जांच $SHELL; यह एक अंतिम उपाय है, क्योंकि यह आपके डिफ़ॉल्ट शेल को निर्दिष्ट करता है और जरूरी नहीं कि वर्तमान शेल हो।

4
क्या आपको $0भी उल्लेख करना चाहिए ?
मिकेल

मुझे यह पसंद नहीं है $0क्योंकि यह अधिक जटिल है: (1) यह केवल आधार हो सकता है, (2) इसके पास लॉगिन शेल के रूप में नामित करने के लिए सामने की तरफ '-' हो सकता है।
गाइकोसॉर

ps -p$$ -ocmd=""
प्रीटियर

1
@geekosaur: शायद ऐसा है, लेकिन $0अभी भी अधिक उपयोगी लगता है $SHELL: क्या आप सहमत नहीं होंगे? sed'-' को निकालने के लिए आप इसे हमेशा पाइप कर सकते हैं ।
iconoclast

2
यदि आप चला रहे हैं tcsh, $tcshऔर $versionसेट हो जाएगा। ये शेल वैरिएबल हैं, न कि पर्यावरण वैरिएबल। यदि आप एक गैर-tsh संस्करण को चला रहे हैं csh, तो मुझे नहीं लगता कि कोई विशिष्ट चर हैं। और निश्चित रूप से वाक्यविन्यास का उपयोग चर की जांच करने के लिए एक तरफ csh / tsh के बीच होता है, और दूसरे पर sh / ksh / bash / zsh।
कीथ थॉम्पसन

41

मैंने पाया है कि मैंने अपने सिस्टम पर जो चार गोले लगाए हैं उनमें निम्नलिखित कार्य (bash, डैश, zsh, csh):

$ ps -p $$

निम्नलिखित zsh, bash और डैश पर काम करता है, लेकिन csh पर नहीं:

$ echo $0

2
साथ ही मछली पर काम नहीं करता है।
रॉन ई

मुझे लगता है कि @ jiliagre का जवाब शायद मैं आज उपयोग करूंगा। मछली की %selfजगह पर इस्तेमाल किया जा सकता है$$
स्टीवन डी

8

जैसा कि उपयोग किए गए शेल के लिए प्रश्न पूछता है और इसके लिए पारित संभावित तर्कों के बारे में बात नहीं करता है, यहां एक तरीका है जो उन्हें दिखाने से बचें:

$ ps -o comm= -p $$
ksh93 

6

कुछ लाइटर कार्यान्वयन के बारे में एक नोट (एंड्रॉइड फोन, बिजीबॉक्स, आदि): psहमेशा -pस्विच के लिए समर्थन नहीं होता है , लेकिन आप जैसे कमांड के साथ खोज को पूरा कर सकते हैं ps | grep "^$$ "। (यह grepरेगेक्स विशिष्ट रूप से पीआईडी ​​की पहचान करेगा, इसलिए कोई गलत सकारात्मकता नहीं होगी।


7
ps | grep $$उदाहरण के लिए, यदि आपकी वर्तमान प्रक्रिया है 1234और एक प्रक्रिया है , तब भी झूठी सकारात्मक जानकारी दे सकते हैं 12345
कीथ थॉम्पसन

4

वास्तव में दो सरल तरीके हैं:

  • पीएस कमांड का उपयोग करना :

    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फ़ाइल के लिंक को निष्पादित किया जा रहा है, जो इस स्थिति में / bin / bash, / bin / ksh, आदि को इंगित करेगा।

    केवल शेल के नाम को प्राप्त करने के लिए आप केवल उपयोग कर सकते हैं

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

    यह एकमात्र विकल्प है जो हमेशा एक ही परिणाम देगा, भले ही आप स्क्रिप्ट, स्रोत कोड या टर्मिनल में हों, उपयोग में शेल दुभाषिया के बाइनरी के लिंक के रूप में।

    चेतावनी आपको पता होना चाहिए कि यह अंतिम बाइनरी दिखाएगा, इसलिए ksh को ksh93 से लिंक किया जा सकता है या bash को हिलाया जा सकता है।

का उपयोग /procवास्तव में के माध्यम से उपयोगी है /proc/self, जो वर्तमान कमांड के पीआईडी ​​से जोड़ता है।


3

मैक (कॉम), सोलारिस (fname) और लिनक्स (cmd) के साथ संगत अन्य सभी उत्तरों का मिश्रण:

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

यह मुझे मेरी वर्तमान निर्देशिका का नाम देता है; भी, के तहत cshऔर tcshयह मुझे देता हैAmbiguous output redirect.
iconoclast

2

यदि आपने इसे अपने पर्यावरण चर में बचाया है, तो आप निम्नलिखित का उपयोग कर सकते हैं:

echo $SHELL

यह सबसे अधिक संभावना है कि आपके लॉगिन शेल के निष्पादन योग्य शेल का पथनाम वापस आ जाएगा। यह निश्चित नहीं है कि लॉगिन शेल वह है जो आप वर्तमान में चला रहे हैं।
Kusalananda

1

रनिंग शेल की पीड को $ $ $ (ज्यादातर गोले में) द्वारा दिया जाता है।

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

Jsh (Heirlomm shell) कार्य करने के लिए बैकटिक्स का उपयोग करना।

कई गोले में ps -o args= -p $$काम करता है की प्रत्यक्ष परीक्षण , लेकिन busybox ashउस पर विफल (हल)।

सबसे झूठी सकारात्मकता $1को $$हटाने के लिए चेक जो समान होना चाहिए ।

अंतिम ;:का उपयोग ksh और zsh के लिए शेल को चलाने के लिए किया जाता है।

अधिक सिस्टम पर टेस्ट से मदद मिलेगी, कृपया टिप्पणी करें कि क्या यह आपके लिए काम नहीं करता है।

cshगोले के प्रकार में काम नहीं करता है ।


ओएस / एक्स पर, मेरे परीक्षणों में, मुझे कम से कम 3 लाइनें मिलती हैं, शेल के लिए एक, एक के लिए /usr/lib/dyld, एक के लिए /private/var/db/dyld/dyld_shared_cache_x86_64
स्टीफन चेज़लस

हां, अब यह केवल / bin और / usr / bin में प्रविष्टियों का चयन करता है
स्टीफन चेज़लस

@ स्टीफनचेज़ेलस शायद अब बेहतर है?

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संभवतः मौलिक रूप से अलग है (इसलिए चेतावनी और पांच सेकंड के ठहराव) से यह खंड पॉसिक्स-शैली की स्क्रिप्ट में रोल करने के लिए संभव नहीं है। (एक के लिए, csh-स्टाइल शैल नहीं कर सकते हैं 2>/dev/nullया >&2, जैसा कि प्रसिद्ध Csh प्रोग्रामिंग में माना जाता है हानिकारक रंट ।)


-1

आप बस echo $0कमांड का उपयोग कर सकते हैं कि आप किस शेल का उपयोग कर रहे हैं और <name_of_the_shell> --versionशेल के संस्करण की जांच करें। (जैसे। bash --version)।


स्टीवन डी ने पहले ही इसका उल्लेख किया है
:)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.