Bir terminalde hangi kabuğu kullandığımı nasıl test ederim?


69

Bir terminalde hangi kabuğu kullanıyorum nasıl kontrol edilir? MacOS'ta kullandığım kabuk nedir?


2
@xenoterracide: en azından unix.stackexchange.com/questions/3645/… . geekosaur'un cevabı daha tamamlandı, bu yüzden önceki soruyu kapatmak için oy kullandım.
Gilles

1
echo $ SHELL, hayır?
masum dünya

@ masum-dünya Hayır, echo #SHELLtam değil. Geekosaur tarafından verilen cevapta # 3'e bakınız .
Basil Bourque,

"Kabuk" un iyi tanımlanmış bir anlamı olduğundan emin değilim. Mesela koşabilirsin xterm -e /bin/cat ama ben /bin/catkabuk çağırmaktan mutlu değilim .
Basile Starynkevitch,

Ayrıca bazı kabuklar ( scsh gibi) sözdizimi gibi POSIX kabuğu kullanmaz.
Basile Starynkevitch

Yanıtlar:


71

En çok en az güvenilir (ve en çok en az "ağır") olan birkaç yol:

  1. ps -p$$ -ocmd=. (Solaris'te fnamebunun yerine olması gerekebilir cmd. OSX ve commandyerine BSD'de olması gerekir cmd.)
  2. Olup olmadığını kontrol edin $BASH_VERSION, $ZSH_VERSIONve diğer kabuk özgü değişkenler.
  3. Kontrol edin $SHELL; Bu, geçerli kabuğunuzu değil , varsayılan kabuğunuzu belirttiği için son çaredir.

4
Siz de bahsetmeli misiniz $0?
Mikel

Sevmiyorum $0çünkü daha karmaşık: (1) sadece bir temel ad olabilir, (2) ön tarafta bir giriş kabuğu olarak atamak için '-' olabilir.
geekosaur

ps -p$$ -ocmd=""daha güzel :-)
asoundmove

1
@geekosaur: belki öyle, ama $0yine de daha faydalı görünüyor $SHELL: kabul etmiyor musunuz? sed'-' işaretini çıkarmak için her zaman içinden boru geçirebilirsiniz .
iconoclast

2
Eğer çalıştırdığınız tcsh, $tcshve $versionkurulacaktır. Bunlar kabuk değişkenleri, çevre değişkenleri değil. Tcsh olmayan bir sürümünü çalıştırıyorsanız csh, ayırt edici değişkenler olduğunu sanmıyorum. Ve tabii ki değişkenleri kontrol etmek için kullanılan sözdizimi bir yandan csh / tcsh, diğer yandan sh / ksh / bash / zsh arasında değişir.
Keith Thompson

41

Aşağıdakilerin sistemime kurduğum dört kabukta çalıştığını buldum (bash, dash, zsh, csh):

$ ps -p $$

Aşağıdakiler zsh, bash ve dash üzerinde çalışır, ancak csh üzerinde olmaz:

$ echo $0

2
Ayrıca balık üzerinde çalışmaz.
Ron E,

@ Jiliagre'ın cevabının muhtemelen bugün kullanacağımı düşünüyorum. Balık %selfyerine kullanılabilir$$
Steven D

8

Soru, kabuğun kullanılmasını istediği ve kendisine iletilen potansiyel argümanlardan bahsetmediği için, bunları göstermekten kaçınmanın bir yolu:

$ ps -o comm= -p $$
ksh93 

6

Bazı daha hafif uygulamalar (Android telefonlar, meşgul kutusu vb.) Hakkında bir not: anahtar psiçin her zaman destek yoktur -p, ancak aramayı istediğiniz gibi yapabilirsiniz ps | grep "^$$ ". (Bu grepregex PID'yi benzersiz bir şekilde tanımlayacaktır, bu nedenle herhangi bir yanlış pozitif olmayacaktır.


7
ps | grep $$Mevcut işleminiz 1234ve bir işlem varsa, yine de yanlış pozitifler verebilir 12345.
Keith Thompson

4

Gerçekten çok basit iki yol var:

  • Ps komutunu kullanarak :

    ps -o comm= $$

    veya

    ps -h -o comm -p $$

    nerede:

    • -hveya =herhangi bir başlığın gösterilmemesi için tüm seçeneklerin sonlandırılması .
    • -o commsadece süreç basename ( bashyerine /bin/bash) göstermek için.
    • -p <PID> sadece PID form listesiyle yapılan işlemi listeler.
  • Kullanılması / proc süreç bilgi sözde dosya sistemi:

    cat /proc/$$/comm

    Bu seçenek tam olarak psyukarıdaki komut gibi davranır .

    veya

    readlink /proc/$$/exe

    Bu /proc/PID/exe, yürütülmekte olan dosyaya bağlanır; bu durumda / bin / bash, / bin / ksh, vb.

    Sadece kabuğun adını almak için kullanabilirsiniz.

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

    Bir komut dosyasında, kaynak kodda veya terminalde olsanız bile, kullanılan kabuk yorumlayıcısının ikilisine bağlantılar olarak her zaman aynı sonucu verecek tek seçenek budur.

    Uyarı Bunun nihai ikili değeri göstereceğinin farkında olmalısınız, bu nedenle ksh ksh93 veya sh ile bash arasında olabilir.

Geçerli komutun PID'sine bağlanan, /procüzerinden kullanımı gerçekten yararlıdır /proc/self.


3

Mac (comm), Solaris (fname) ve Linux (cmd) ile uyumlu tüm diğer cevapların bir karışımı:

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

bu bana geçerli dizin adımı veriyor; Ayrıca, altında cshve tcshbana verirAmbiguous output redirect.
iconoclast

2

Ortam değişkenlerinize kaydettiyseniz, aşağıdakileri kullanabilirsiniz:

echo $SHELL

Bu büyük olasılıkla giriş kabuğunuzun çalıştırılabilir kabuğunun yol adını döndürecektir. Giriş kabuğunun şu anda çalıştığınız şey olduğu kesin değildir.
Kusalananda

1

Çalışan kabuğun pid'i var $$ (çoğu kabukta) tarafından verilir.

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

Jsh (Heirlomm shell) 'in çalışmasını sağlamak için geri tepmeler kullanmak.

Birçok kabukta doğrudan ps -o args= -p $$çalışmaların denenmesi ancak busybox ashbunun üzerinde başarısız olur (çözüldü).

Yanlış pozitiflerin çoğuna $1eşit olması gereken kontrol $$.

Sonuncusu ;:kabuğun ksh ve zsh için çalışmasını sağlamak için kullanılır.

Daha fazla sistem üzerinde yapılan testler size yardımcı olacaktır, lütfen sizin için işe yaramazsa yorum yapın.

Mermi cshtürü çalışmıyor .


OS / X'de, testlerimde en az 3 satır alırım, biri kabuk için /usr/lib/dylddiğeri diğeri için /private/var/db/dyld/dyld_shared_cache_x86_64.
Stéphane Chazelas 07:15

Evet, şimdi yalnızca / bin ve / usr /
bin'deki

@ StéphaneChazelas Belki şimdi daha iyi?

0

$MYSHELLShell-agnostic'imde gelecekteki testler için belirledim ~/.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

Bu tcshbölüm çok radikal bir şekilde farklı olduğundan POSIX tarzı bir betiğe girme olasılığı yüksektir (bu nedenle uyarı ve beş saniye duraklama). (Birincisi, cshtarzlı mermiler yapamaz 2>/dev/nullya da >&2, ünlü Csh Programlama'da Zarar Gördüğü Zararlı rantında belirtildiği gibi yapamaz .)


-1

echo $0Hangi kabuğu kullandığınızı <name_of_the_shell> --versionkontrol etmek ve kabuğun sürümünü kontrol etmek için sadece komutu kullanabilirsiniz . (örn. bash --version).


Steven D zaten bahsetti
:)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.