Bir terminalde hangi kabuğu kullanıyorum nasıl kontrol edilir? MacOS'ta kullandığım kabuk nedir?
xterm -e /bin/cat ama ben /bin/catkabuk çağırmaktan mutlu değilim .
Bir terminalde hangi kabuğu kullanıyorum nasıl kontrol edilir? MacOS'ta kullandığım kabuk nedir?
xterm -e /bin/cat ama ben /bin/catkabuk çağırmaktan mutlu değilim .
Yanıtlar:
En çok en az güvenilir (ve en çok en az "ağır") olan birkaç yol:
ps -p$$ -ocmd=. (Solaris'te fnamebunun yerine olması gerekebilir cmd. OSX ve commandyerine BSD'de olması gerekir cmd.)$BASH_VERSION, $ZSH_VERSIONve diğer kabuk özgü değişkenler.$SHELL; Bu, geçerli kabuğunuzu değil , varsayılan kabuğunuzu belirttiği için son çaredir.$0?
$0çünkü daha karmaşık: (1) sadece bir temel ad olabilir, (2) ön tarafta bir giriş kabuğu olarak atamak için '-' olabilir.
ps -p$$ -ocmd=""daha güzel :-)
$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 .
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.
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
%selfyerine kullanılabilir$$
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.
ps | grep $$Mevcut işleminiz 1234ve bir işlem varsa, yine de yanlış pozitifler verebilir 12345.
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.
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
cshve tcshbana verirAmbiguous output redirect.
Ortam değişkenlerinize kaydettiyseniz, aşağıdakileri kullanabilirsiniz:
echo $SHELL
Ç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 .
/usr/lib/dylddiğeri diğeri için /private/var/db/dyld/dyld_shared_cache_x86_64.
$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 .)
Bu da çalışır:
env | grep SHELL