it-swarm-id.com

Bagaimana cara menguji Shell yang saya gunakan di terminal?

Bagaimana cara memeriksa Shell yang saya gunakan di terminal? Apa Shell yang saya gunakan di MacOS?

73
user5837

Beberapa cara, dari yang paling dapat diandalkan (dan "paling berat"):

  1. ps -p$$ -ocmd=. (Pada Solaris, ini mungkin harus fname bukan cmd. Pada OSX dan pada BSD harus command bukan cmd.)
  2. Cek untuk $BASH_VERSION, $ZSH_VERSION, dan variabel khusus Shell lainnya.
  3. Periksa $Shell; ini adalah pilihan terakhir, karena ini menentukan default Shell Anda dan belum tentu saat ini Shell.
75
geekosaur

Saya telah menemukan bahwa yang berikut ini berfungsi pada empat shell yang telah saya instal pada sistem saya (bash, dash, zsh, csh):

$ ps -p $$

Berikut ini berfungsi pada zsh, bash, dan dash, tetapi tidak pada csh:

$ echo $0
43
Steven D

Saat pertanyaan menanyakan Shell yang digunakan dan tidak berbicara tentang potensi argumen yang diteruskan kepadanya, berikut adalah cara yang tidak menunjukkannya:

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

Catatan tentang beberapa implementasi yang lebih ringan (ponsel Android, busybox, dll.): ps tidak selalu memiliki dukungan untuk -p beralih, tetapi Anda dapat menyelesaikan pencarian dengan perintah seperti ps | grep "^$$ ". (Regex grep ini akan secara unik mengidentifikasi PID, sehingga tidak akan ada kesalahan positif.

6
palswim

Ada dua cara yang sangat sederhana:

  • Menggunakan ps perintah:

    ps -o comm= $$
    

    atau

    ps -h -o comm -p $$
    

    dimana:

    • -h atau menyelesaikan semua opsi dengan = untuk tidak menampilkan header apa pun.
    • -o comm untuk hanya menampilkan nama proses (bash alih-alih /bin/bash).
    • -p <PID> daftar hanya proses dengan daftar formulir PID yang disediakan.
  • Menggunakan /proc memproses informasi sistem file pseudo:

    cat /proc/$$/comm
    

    Opsi ini berlaku persis seperti perintah ps di atas.

    atau

    readlink /proc/$$/exe
    

    Ini /proc/PID/exe tautan ke file yang sedang dieksekusi, yang dalam hal ini mengarah ke/bin/bash,/bin/ksh, dll.

    Untuk mendapatkan hanya nama Shell yang bisa Anda gunakan

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

    Ini adalah satu-satunya opsi yang akan selalu memberikan hasil yang sama bahkan jika Anda berada dalam skrip, kode sumber, atau terminal, sebagai tautan ke biner dari penerjemah Shell yang digunakan.

    Peringatan Anda harus sadar bahwa ini akan menampilkan biner utama, jadi ksh dapat ditautkan ke ksh93 atau sh to bash.

Penggunaan /proc sangat berguna melalui /proc/self, yang menautkan ke PID dari perintah saat ini.

5
David Goitia

Gabungan dari semua jawaban lain, kompatibel dengan Mac (comm), Solaris (fname) dan Linux (cmd):

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

Jika Anda menyimpannya di variabel lingkungan Anda, Anda dapat menggunakan yang berikut:

echo $Shell
2
jasonleonhard

Pid dari Shell yang berjalan diberikan oleh var $$ (dalam kebanyakan shell).

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

Menggunakan backticks untuk membuat jsh (Heirlomm Shell) berfungsi.

Dalam banyak shell tes langsung ps -o args= -p $$ berfungsi, tetapi busybox ash gagal karenanya (terpecahkan).

Cek itu $1 harus sama dengan $$ menghapus sebagian besar positif palsu.

Yang terakhir ;: digunakan untuk menjaga Shell tetap berjalan untuk ksh dan zsh.

Tes pada lebih banyak sistem akan membantu, silakan beri komentar jika itu tidak berhasil untuk Anda.

Tidak berfungsi dalam jenis kerang csh.

1
user79743

Aku menyiapkan $MYSHELL untuk tes selanjutnya di agnostik Shell saya ~/.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

Bagian tcsh kemungkinan tidak bijaksana untuk masuk ke skrip gaya POSIX karena sangat berbeda (sehingga peringatan dan jeda lima detik). (Untuk satu, csh- kerang gaya tidak bisa dilakukan 2>/dev/null atau >&2, seperti yang tercantum dalam kata-kata terkenal Pemrograman Csh Dianggap Berbahaya .)

0
Adam Katz