Hangi kabuğu kullandığımı nasıl kontrol edebilirim?


357

Terminalin kabuktan başka bir şey olmadığını okudum ve Unix farklı kabuk özellikleri sunuyor:

  • Bourne kabuğu (sh)
  • C kabuğu (csh)
  • TC kabuğu (tcsh)
  • Korn kabuğu (ksh)
  • Bourne Yine kabuğu (bash)

Sorular:

  • Bir terminal penceresi açtığımda hangi kabuk varsayılan olarak açılır?
  • Kaç tane mermi takıldığını nasıl kontrol edebilirim?
  • Hesabımdan kullanılan kabuğu nasıl değiştiririm?



Lütfen terminalin kabuğa arayüz olduğunu (bir noktada aslında fiziksel arayüz olarak kullanıldığını) ve kabuğun terminal olmadığını unutmayın - bu bir komut yorumlayıcısıdır. Ayrıca bakınız askubuntu.com/a/640105/295286
Sergiy Kolodyazhnyy

Yanıtlar:


427

Hangi kabuğu kullandığınızı görmek için terminalinize aşağıdaki komutu yazabilirsiniz:

echo $0

Bash ( Bourne Again Shell ) terminalini kullanıyorsanız, sonuç aşağıdakine benzer bir şekilde görünecektir :

-bash

2
olan 0bir ortam değişkeni?
Mi_Onim

43
@Mi_Onim $ 0, çalışan işlemin adıdır. Bir kabuğun içinde kullanırsanız, kabuğun adını döndürür. Bir betiğin içinde kullanırsanız, betiğin adı olacaktır.
kingmilo

2
NOT : Bu etkileşimli için işe yaramaz csh. % echo $0 No file for $0., ama bunun için çalışıyortcsh
Sergiy Kolodyazhnyy

2
Biri sembolik olduğunda işe yaramaz. Gibi basholaraksh
Anwar

9
Eğer gelen kabuk adını aldıktan sonra @Anwar, iyi bir noktaya değindi echo $0, ls -l `which <name>` başka bir kabuk ikili sembolik olarak olup olmadığını görmek için.
JivanAmara

121

Varsayılan ortamda bulunan kabuğunu bulmak için SHELLortam değişkeninin değerini kontrol edebilirsiniz :

echo $SHELL

Geçerli kabuk örneğini bulmak için, geçerli kabuk örneğinin PID'sine sahip olan işlemi (kabuk) arayın.

Geçerli kabuğun örneğinin PID'sini bulmak için:

echo "$$"

Şimdi PID'ye sahip süreci bulmak için:

ps -p <PID>

Bir araya getirmek:

ps -p "$$"

27
$ SHELL, sistemin (veya kullanıcının) varsayılan kabuğudur; bu, genellikle herhangi bir anda kullanılan kabuktur (ancak zorunlu değildir).
kingmilo

1
@ kingmilo: Haklısın, cevap değiştirildi.
heemayl

Bir kullanıcıya 'su - <username>' üzerinden geçerken bunu çok yararlı buldum, örneğin postgres, jenkins, ...
bully

1
echo $SHELLverdi /bin/cshve ps -p $$verdi 22673 pts/1 00:00:00 bash. Kingmilo (yukarıda) neden aynı olmadığını açıkladı.
18446744073709551615

@ 18446744073709551615 İkisinin de aynı olduğunu söylemedim. Lütfen cevabı tekrar dikkatlice okuyunuz; varsayılan ve geçerli ifadeleri not edin .
heemayl

25

$SHELLsize varsayılan kabuğu verir. $0size şu anki kabuğu verir.

Örneğin: Terminal Uygulam için kullandığım varsayılan kabuk olarak bash'ım var. Penceresi açılır Ama benim iTerm2 uygulaması için, ben komutu kullanın: /bin/ksh.

Öyleyse $0bana /bin/kshiTerm2'yi veriyor . $SHELLbana /bin/bashiTerm2'yi veriyor . $0, $SHELLbana /bin/bashTerminal verir


2
Bu, en çok oy alan diğer cevapların hoş bir karamsarlığı. Teşekkür ederim.
Michael Hoffmann

Benim için, zsh'yi yükledim ve mevcut varsayılan, bash olarak değiştirmek için bashterminalde yazmam gereken tek şey bu. Zsh'ye geri dönmek için,zsh
Yousuf Azad

8

Kullanıcınız için varsayılan kabuğun hangisi olduğunu bilmek için aşağıdakileri çalıştırabilirsiniz:

echo "$SHELL"

Örneğin, Bash kullanıyorsanız aşağıdaki çıktıyı almalısınız:

/bin/bash

Herhangi bir konfigürasyonu değiştirmediyseniz, Bash olmalıdır çünkü Ubuntu'daki varsayılan kabuk budur.


/ bin / sh, Bourne Kabuğu değil, Kabuk Komuta Dili'dir, lütfen cevabınızı düzenleyin.
kingmilo

@ kingmilo Cevabımda /bin/shreferans yok
kos

@ kol düzenlemeden önce vardı. Lütfen ayrıca $ SHELL'ın sistem (veya kullanıcı) için varsayılan bir kabuk olduğunu ve bu işlemin genellikle herhangi bir anda kullanılan kabuk olduğunu (ancak zorunlu olarak gerektirmediğini) unutmayın.
kingmilo

1
@ kingmilo Cevabı tekrar okuduğumda endişenin ne olduğunu anladığımı düşünüyorum. Cevabımdaki "şu an" anlamını açıklığa kavuşturdum
kos

1
@ frederickjh balık burada biraz garip biri. $$Değişken aslında bir POSIX tarafından tanımlanmış ve kabukları büyük çoğunluğu üzerinde çalışacak. Balık buradaki standarda uymamaya karar verdi, bu yüzden görmezden gelmenin adil olduğunu düşünüyorum. $$Sh, dash, bash, zsh, ksh, ash, tcsh ve csh'de beklendiği gibi çalıştığını onaylayabilirim . Aslında, başımın üstünde, çalışmadığı yerde balık dışında başka bir kabuk düşünemiyorum.
terdon

8

Diğer cevaplar, kabuğa özgü özellikler kullanma eğilimindedir, ancak hangi kabuğunu kullandığımızı keşfetmeye çalışıyoruz, bu yüzden sorunun cevabını kabul ediyorlar. Örneğin, cevapların hiçbiri balık üzerinde çalışmayacak.

sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p

Bunun yerine, $ sh çağrısında $$ sözdizimini kullanın, ancak PID'yi değil PPID'yi arıyoruz. Cmd'yi bulmak için PPID'yi kullanın.

sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe'

Geliştirme muru için teşekkürler


2
Başlıkları (ve diğerlerini ) atlamak ppid=/ kullanmak cmd=için kullanabilirsiniz tail -1ve /proc/.../exehangi dosyanın çalıştırıldığına bakmayı düşünün ( cmdçıktı, kabuğu ne çalıştırdıysa manipüle edilebilir).
muru

1
Görünüşe göre bu posix uyumsuzluğu nedeniyle meşgul kutusunda çalışmıyor
Evan Benn

4

Orijinal yazı üç soru sordu. Verilen cevaplar, "Bir terminal penceresi açtığımda hangi kabuk varsayılan olarak açılır?" İlk sorusunu kapsar. Ayrıca, "Terminalde şu anda hangi kabuğun çalıştığını nasıl öğrenebilirim?" Diye sorulmamış bir soruyu yanıtlıyorlar. Ancak, görebildiğim kadarıyla, hiç kimse ilk başta sorulan ikinci veya üçüncü soruya cevap vermedi, "Kaç merminin takılı olduğunu nasıl kontrol ederim?" ve "Hesabımdan kullanılan kabuğu nasıl değiştiririm?"

  • Cevaplamak için "Kaç merminin kurulu olduğunu nasıl kontrol edebilirim?" Aşağıdaki komut mevcut tüm kabukları listeler:

kedi / etc / kabukları

Örneğin, varsayılan Ubuntu 18.10 kurulumunda bu şunları verir:

# / etc / shells: geçerli giriş kabukları

/ Bin / sh

/ Bin / tire

/ Bin / bash

/ Bin / rbash

Bununla birlikte, varsayılan olarak sh, çizgi için sembolik bir bağlantıdır, rb ise -r ("sınırlı bash") seçeneğiyle bash'a bağlanır, bu yüzden yukarıdaki listede önerildiği gibi dörde değil, sadece iki kabuk vardır. Aşağıdaki komut size listelenen mermilerden birinin aslında sembolik bağlar olup olmadığını ve eğer öyleyse nereye bağlandıklarını gösterecektir: ls -l / bin

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.