it-swarm-tr.com

Terminalde hangi Shell'i kullandığımı nasıl test edebilirim?

Terminalde hangi Shell'i kullandığımı nasıl kontrol edebilirim? MacOS'ta kullandığım Shell nedir?

73
user5837

En az en az güvenilir (ve en az en az "ağır") çeşitli yollar:

  1. ps -p$$ -ocmd=. (Solaris'te bunun fname yerine cmd olması gerekebilir. OSX ve BSD'de command yerine cmd olmalıdır.)
  2. Kontrol $BASH_VERSION, $ZSH_VERSION ve diğer Kabuğa özgü değişkenler.
  3. Kontrol $Shell; varsayılan Kabuğunuzu belirttiği ve geçerli Kabuğunuzu belirtmediği için bu son çare.
75
geekosaur

Sistemime kurduğum dört kabukta (bash, dash, zsh, csh) aşağıdaki çalışmaların yapıldığını buldum:

$ ps -p $$

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

$ echo $0
43
Steven D

Soru, kullanılan Kabuk'u sorduğu ve kendisine iletilen potansiyel argümanlar hakkında konuşmadığı için, bunları göstermekten kaçınmanın bir yolu:

$ ps -o comm= -p $$
ksh93 
8
jlliagre

Bazı daha hafif uygulamalar (Android telefonlar, meşgul kutusu vb.) Hakkında bir not: ps her zaman -p anahtarıdır, ancak aramayı ps | grep "^$$ ". (Bu grep regex, PID'yi benzersiz bir şekilde tanımlayacaktır, bu nedenle yanlış pozitif olmayacaktır.

6
palswim

Gerçekten çok basit iki yol var:

  • ps komutunu kullanarak:

    ps -o comm= $$
    

    veya

    ps -h -o comm -p $$
    

    nerede:

    • -h Veya başlık göstermediği için tüm seçenekleri = İle bitiriyoruz.
    • -o comm Yalnızca işlem temel adını gösterir (/bin/bash Yerine bash).
    • -p <PID> Listesi yalnızca PID form listesinin sağlandığı işlemi gerçekleştirir.
  • /proc işlem bilgileri sözde dosya sistemini kullanarak:

    cat /proc/$$/comm
    

    Bu seçenek yukarıdaki ps komutu gibi davranır.

    veya

    readlink /proc/$$/exe
    

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

    Yalnızca Kabuğun adını almak için

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

    Komut dosyası, kaynaklı kod veya terminalde olsanız bile, kullanımdaki Kabuk yorumlayıcısının ikili dosyasına bağlantılar olarak her zaman aynı sonucu veren tek seçenektir.

    Uyarı Bunun en büyük ikiliyi göstereceğinin farkında olmalısınız, bu nedenle ksh ksh93 veya sh to bash ile bağlantılı olabilir.

/proc Kullanımı, geçerli komutun PID'sine bağlanan /proc/self Aracılığıyla gerçekten kullanışlıdır.

5
David Goitia

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

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

Ortam değişkenlerinize kaydettirdiyseniz aşağıdakileri kullanabilirsiniz:

echo $Shell
2
jasonleonhard

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

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

Jsh (Heirlomm Shell) 'i çalıştırmak için ters tırnakları kullanma.

Birçok mermide doğrudan ps -o args= -p $$ Testi çalışır, ancak busybox ash Bu konuda başarısız olur (çözülmüş).

$1 Öğesinin $$ Değerine eşit olması gerektiğinden emin olun, çoğu yanlış pozitifi kaldırır.

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

Daha fazla sistemdeki testler yardımcı olacaktır, lütfen sizin için işe yaramazsa bir yorum yapın.

csh mermi türünde çalışmaz.

1
user79743

Shell-agnostic'imdeki $MYSHELL Sonraki testler için ~/.aliases Ayarladım:

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 bölümü, çok farklı olduğu için POSIX stili bir komut dosyasına dönüştürülemez (bu nedenle uyarı ve beş saniye duraklama). (Birincisi, csh tarzı mermiler, ünlü Csh Programlama Zararlı Olarak Kabul Edilir rant'ta belirtildiği gibi 2>/dev/null Veya >&2 Yapamaz.)

0
Adam Katz