Mencari tahu shell default pengguna dalam skrip shell

10

Saya bertanya-tanya apakah ada cara untuk mengetahui shell default dari pengguna saat ini dalam skrip shell?

Use case: Saya sedang mengerjakan skrip yang menetapkan alias untuk suatu perintah dan alias ini diatur dalam skrip shell.

!# /bin/bash
alias = 'some command to set the alias'

Ada logika di skrip tempat skrip mencoba menemukan shell default dari pengguna yang mengeksekusi skrip dan menambahkan alias ini di masing-masing file ~ / .bashrc atau ~ / .zshrc

Tetapi ketika saya menambahkan shebang di bagian depan skrip dan secara eksplisit memintanya untuk menggunakan bash, jawaban yang diposting di sini selalu mengembalikan bash seperti yang diharapkan walaupun saya mengeksekusi skrip ini pada terminal ZSH.

Apakah ada cara untuk mendapatkan tipe shell di mana skrip dieksekusi terlepas dari set shebang?

Saya mencari solusi yang berfungsi pada Mac dan semua bistro berbasis linux.

Pembalap Spanyol89
sumber
@StephenRauch Seharusnya saya sebutkan sebelumnya, saya mencari metode yang bekerja pada sistem berbasis Mac dan Linux. / etc / passwd pada Mac tidak mengandung informasi pengguna dan hanya dikonsultasikan dalam mode pengguna tunggal.
Pembalap
Apa yang /etc/passwdada di OSX? Saya sempat melihat-lihat online dan tampaknya shell ada di sana, hanya saja bukan nama pengguna. Namun, ID pengguna masih ada, mengapa Anda tidak menggunakannya?
terdon
Saya ingin tahu apakah mungkin memiliki daftar kerang yang lengkap. Atau apakah semua file startup shell selalu sesuai dengan. {Name_of_shell} rc?
jamesqf

Jawaban:

6
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh
Ipor Sircer
sumber
Terima kasih itu berfungsi seperti pesona! Ini adalah satu-satunya solusi yang mungkin bekerja untuk bistro berbasis mac dan linux.
Pembalap
1
BTW, saya mengedit sedikit perintah untuk membuatnya agnostik untuk semua OS finger $USER | grep 'Shell:*' | cut -f3 -d ":"karena opsi grep -P tidak didukung pada Mac.
Pembalap
2
Perhatikan bahwa fingermungkin tidak diinstal pada semua mesin. Ini adalah paket opsional pada sistem berbasis RedHat.
Stephen Harris
1
@Kishorepandey: Anda dapat menggunakan getent|grep ^$USER:|cut -f: -f7alih-alih jari, jika jari tidak dipasang secara default.
Ipor Sircer
@Kishorepandey Jangan lakukan ini. Gunakan SHELLvariabel lingkungan jika ada. Melihat basis data pengguna akan memberi Anda hasil (shell login pengguna) tetapi itu mungkin bukan hasil yang tepat (shell interaktif favorit pengguna) - tergantung pada konfigurasi pengguna.
Gilles 'SO- stop being evil'
19

Variabel lingkungan, SHELLakan selalu mengembang ke shell login default dari pengguna yang memanggil (mendapatkan nilai dari /etc/passwd).

Untuk pengguna lain mana pun, Anda perlu melakukan beberapa pemrosesan /etc/passwd, berikut adalah awkcuplikan sederhana :

awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd

Ganti foobardengan nama pengguna yang sebenarnya.

Jika Anda memiliki ldap(atau sesuatu yang serupa di tempat), gunakan getentuntuk mendapatkan database daripada langsung menguraikan /etc/passwd:

getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'

atau pendekatan terbersih, mari getentlakukan parsing (terima kasih kepada @Kusalananda):

getent passwd foobar | awk -F: '{print $NF}'
heemayl
sumber
3
getent passwd foobaruntuk melewati harus mencocokkan garis tertentu.
Kusalananda
Terima kasih atas jawabannya. Seharusnya saya sebutkan sebelumnya, saya mencari metode yang bekerja pada sistem berbasis Mac dan Linux. / etc / passwd pada Mac tidak mengandung informasi pengguna dan hanya dikonsultasikan dalam mode pengguna tunggal.
Pembalap
4

Karena getentbukan perintah standar pada MacOS, Anda mungkin ingin menggunakan getpwuidpanggilan tingkat bawah yang akan berkonsultasi dengan layanan penamaan yang dikonfigurasikan oleh mesin. Ini mungkin memerlukan panggilan ke perlatau python, yang sangat umum di sebagian besar platform mirip Unix

mis. ini akan mengembalikan shell untuk pengguna saat ini:

perl -e '@x=getpwuid($<); print $x[8]'
Stephen Harris
sumber
2

Anda bisa mendapatkan shell default pengguna dari lingkungan seperti ini:

echo $SHELL

Tapi tidak seperti ini:

echo $0

Yang terakhir hanya akan memberi tahu Anda apa shell script Anda sedang menggunakan. Jadi Anda ingin opsi pertama di atas.

Alxs
sumber
0

Pendek dan tidak menyakitkan:

getent passwd <USER> | cut -d : -f 7
David Foerster
sumber
0

Mungkin ini:

   grep $USER </etc/passwd | cut -f 7 -d ":"
pengguna226946
sumber
Ini tidak membaik pada jawaban yang sudah diberikan.
Kusalananda
Ini tidak akan berfungsi jika ada banyak pengguna dengan pekerjaan yang sama; misalnya jika USER=fredmaka ini akan cocok fred, frederick, alfred, alfredo...
Stephen Harris