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.


@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

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}'

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]'

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.



0

Mungkin ini:

   grep $USER </etc/passwd | cut -f 7 -d ":"

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.