Bagaimana saya memeriksa shell yang saya gunakan?

359

Saya membaca bahwa terminal tidak lain adalah shell, dan Unix menyediakan rasa berbeda dari shell:

  • Bourne shell (sh)
  • C shell (csh)
  • TC shell (tcsh)
  • Korn shell (ksh)
  • Bourne Again shell (bash)

Pertanyaan:

  • Ketika saya membuka jendela terminal, shell mana yang dibuka secara default?
  • Bagaimana saya memeriksa berapa banyak kerang yang dipasang?
  • Bagaimana cara saya mengganti shell yang digunakan dari akun saya?
Pembelajar969
sumber
@KasiyA Ini juga terkait dengan askubuntu.com/questions/87853/…
daisy
Harap dicatat bahwa terminal adalah antarmuka ke shell (yang pada satu titik dulu sebenarnya antarmuka fisik), dan shell bukan terminal - itu adalah interpreter perintah. Lihat juga askubuntu.com/a/640105/295286
Sergiy Kolodyazhnyy

Jawaban:

429

Anda dapat mengetik perintah berikut di terminal Anda untuk melihat shell mana yang Anda gunakan:

echo $0

Hasilnya akan terlihat mirip dengan di bawah ini jika Anda menggunakan terminal bash ( Bourne Again Shell ):

-bash
kingmilo
sumber
2
itu 0variabel lingkungan?
Mi_Onim
43
@Mi_Onim $ 0 adalah nama proses yang sedang berjalan. Jika Anda menggunakannya di dalam shell maka itu akan mengembalikan nama shell. Jika Anda menggunakannya di dalam skrip, itu akan menjadi nama skrip.
kingmilo
2
CATATAN : ini tidak akan berfungsi untuk interaktif csh. % echo $0 No file for $0., tapi itu berhasiltcsh
Sergiy Kolodyazhnyy
2
Tidak berfungsi jika ketika seseorang symlink. Like bashassh
Anwar
9
@Anwar membuat poin yang bagus, setelah Anda mendapatkan nama shell dari echo $0, ls -l `which <name>` untuk melihat apakah itu disinkronkan ke biner shell lain.
JivanAmara
121

Untuk menemukan shell yang Anda miliki di lingkungan default, Anda dapat memeriksa nilai SHELLvariabel lingkungan:

echo $SHELL

Untuk menemukan instance shell saat ini, cari proses (shell) yang memiliki PID instance shell saat ini.

Untuk menemukan PID dari instance shell saat ini:

echo "$$"

Sekarang untuk menemukan proses memiliki PID:

ps -p <PID>

Menyatukannya:

ps -p "$$"
heemayl
sumber
27
$ SHELL adalah shell default untuk sistem (atau pengguna), yang biasanya (tetapi tidak harus) shell yang sebenarnya sedang digunakan pada saat tertentu.
kingmilo
1
@kingmilo: Benar, jawab diubah.
heemayl
Saya menemukan ini cukup berguna ketika beralih ke pengguna melalui 'su - <username>', misalnya untuk mengatur postgres, jenkins, ...
bully
1
echo $SHELLmemberi saya /bin/cshdan ps -p $$memberi saya 22673 pts/1 00:00:00 bash. Kingmilo menjelaskan (di atas) mengapa mereka tidak sama.
18446744073709551615
@ 18446744073709551615 Saya belum mengatakan bahwa keduanya sama. Harap baca jawabannya dengan cermat lagi; perhatikan kata-kata default dan saat ini .
heemayl
25

$SHELLmemberi Anda shell default. $0memberi Anda shell saat ini.

Sebagai contoh: Saya memiliki bash sebagai shell default saya, yang saya gunakan untuk Aplikasi Terminal saya. Tapi untuk aplikasi iTerm2 saya, saya menggunakan perintah sebagai jendela terbuka: /bin/ksh.

Jadi saya $0memberi saya /bin/kshdi iTerm2. $SHELLmemberi saya /bin/bashdi iTerm2. $0, $SHELLberi saya /bin/bashdi Terminal

thenakulchawla
sumber
2
Ini adalah disambiguasi yang bagus dari jawaban terpilih lainnya. Terima kasih.
Michael Hoffmann
Bagi saya, saya telah menginstal zsh dan ini adalah default saat ini, untuk mengubah ke bash, yang harus saya lakukan ketik bashdi terminal. Untuk beralih kembali ke zsh, ketikzsh
Yousuf Azad
8

Untuk mengetahui yang merupakan shell default untuk pengguna Anda, Anda dapat menjalankan:

echo "$SHELL"

Misalnya, jika Anda menggunakan Bash, Anda harus mendapatkan output berikut:

/bin/bash

Jika Anda tidak mengubah konfigurasi apa pun, itu pasti Bash karena Bash itu adalah shell default di Ubuntu.

kos
sumber
/ bin / sh adalah Bahasa Perintah Shell dan bukan Bourne Shell, harap edit jawaban Anda.
kingmilo
@kingmilo Tidak ada /bin/shreferensi dalam jawaban saya
kos
@ Kol ada sebelum edit. Harap perhatikan juga $ SHELL adalah shell default untuk sistem (atau pengguna), yang biasanya (tetapi tidak harus) shell yang sebenarnya sedang digunakan pada saat tertentu.
kingmilo
1
@kingmilo Membaca jawaban lagi saya pikir saya mengerti apa yang menjadi perhatian Anda, mungkin saya tidak mengekspresikan diri dengan baik. Saya mengklarifikasi arti "saat ini" dalam jawaban saya
kos
1
@frederickjh ikan agak aneh di sini. The $$variabel sebenarnya didefinisikan oleh POSIX dan akan bekerja pada sebagian besar kerang. Fish telah memutuskan untuk tidak mengikuti standar di sini jadi saya pikir adil untuk mengabaikannya. Saya dapat mengonfirmasi bahwa $$berfungsi seperti yang diharapkan di sh, dash, bash, zsh, ksh, ash, tcsh dan csh. Bahkan, dari atas kepala saya, saya tidak bisa memikirkan cangkang lain kecuali ikan yang tidak berfungsi.
terdon
8

Jawaban lain cenderung menggunakan fitur spesifik shell, tetapi kami berusaha menemukan shell yang kami gunakan, sehingga mereka mengambil jawaban untuk masalah tersebut. Misalnya tidak ada jawaban yang akan berhasil pada ikan.

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

Alih-alih menggunakan sintaks $$ dalam doa sh, tetapi kemudian kami mencari PPID bukan PID. Gunakan PPID untuk menemukan cmd.

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

Terima kasih untuk peningkatan @muru

Evan Benn
sumber
2
Anda dapat menggunakan ppid=/ cmd=untuk menghilangkan header (dan juga tail -1s), dan mempertimbangkan /proc/.../exeuntuk melihat untuk melihat file apa yang sedang dijalankan (karena cmdoutput dapat dimanipulasi oleh apa pun yang menjalankan shell).
muru
1
Tampaknya ini tidak berfungsi di busybox, karena kepatuhan non posix
Evan Benn
4

Posting asli menanyakan tiga pertanyaan. Jawaban yang diberikan mencakup pertanyaan pertama, "Ketika saya membuka jendela terminal, shell mana yang dibuka secara default?" Mereka juga menjawab pertanyaan yang TIDAK diajukan, yaitu "Bagaimana saya bisa mengetahui shell mana yang sedang berjalan di terminal?" Namun, sejauh yang saya bisa lihat, tidak ada yang menjawab pertanyaan kedua atau ketiga yang awalnya diajukan, yaitu "Bagaimana cara memeriksa berapa banyak shell yang dipasang?" dan "Bagaimana cara saya mengganti shell yang digunakan dari akun saya?"

  • Untuk menjawab "Bagaimana saya memeriksa berapa banyak kerang yang dipasang?" perintah berikut akan mencantumkan semua shell yang tersedia:

cat / etc / shells

Misalnya, pada instalasi default Ubuntu 18.10 ini memberikan:

# / etc / shells: shell login yang valid

/ bin / sh

/ bin / dash

/ bin / bash

/ bin / rbash

Namun, secara default sh adalah tautan simbolis ke dasbor, sedangkan rbash menghubungkan ke bash dengan opsi -r ("bash terbatas") sehingga sebenarnya hanya ada dua shell, bukan empat seperti yang ditunjukkan daftar di atas. Perintah berikut akan menunjukkan kepada Anda apakah salah satu dari shell yang terdaftar sebenarnya adalah tautan simbolik, dan jika demikian di mana mereka terhubung ke: ls -l / bin

Michael D
sumber