Kabuk betiği içindeki bir kullanıcının varsayılan kabuğunu bulma


10

Bir kabuk komut dosyası içinde geçerli kullanıcının varsayılan kabuk bulmak için bir yol olup olmadığını merak ediyordum?

Kullanım örneği: Bir komut için bir diğer ad belirleyen bir komut dosyası üzerinde çalışıyorum ve bu diğer ad, bir kabuk komut dosyası içinde ayarlanır.

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

Kodda, komut dosyasını yürüten kullanıcının varsayılan kabuğunu bulmaya çalıştığı ve bu diğer adı ilgili ~ / .bashrc veya ~ / .zshrc dosyasına eklediği bir mantık var.

Ama ben senaryo önünde bir shebang ekleyerek ve açıkça bash kullanmasını istediğim gibi, burada yayınlanan cevaplar her zaman beklendiği gibi bash bir ZSH terminalinde yürütüyorum.

Shebang kümesine bakılmaksızın betiğin çalıştırıldığı kabuk türünü almanın bir yolu var mı?

Hem Mac'te hem de linux tabanlı bistroda çalışan bir çözüm arıyorum.


@StephenRauch Daha önce de bahsetmiş olmalıydım, hem Mac hem de Linux tabanlı sistemde çalışan bir yöntem arıyorum. Mac'te / etc / passwd kullanıcı bilgilerini içermez ve yalnızca tek bir kullanıcı modunda danışılır.
Spaniard89

/etc/passwdOSX'te neler var? Çevrimiçi hızlı bir bakış vardı ve kabuk var, sadece kullanıcı adı değil gibi görünüyor. Kullanıcı kimliği hala orada, neden kullanmıyorsunuz?
terdon

Kapsamlı bir mermi listesine sahip olmanın bile mümkün olup olmadığını merak ediyorum. Yoksa tüm kabuk başlangıç ​​dosyaları her zaman. {Name_of_shell} rc ile uyumlu mudur?
1917'de jamesqf

Yanıtlar:


6
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh

Teşekkürler bir çekicilik gibi çalışır! Muhtemelen hem mac hem de linux tabanlı bistro için çalışan tek çözüm budur.
Spaniard89

1
BTW, finger $USER | grep 'Shell:*' | cut -f3 -d ":"grep seçenekleri -P Mac'te desteklenmediğinden, tüm işletim sistemlerine agnostik hale getirmek için komutu biraz düzenledim .
Spaniard89

2
fingerTüm makinelere yüklenmeyebileceğini unutmayın . RedHat tabanlı sistemlerde isteğe bağlı bir pakettir.
Stephen Harris

1
@Kishorepandey: getent|grep ^$USER:|cut -f: -f7parmak varsayılan olarak yüklenmediyse parmak yerine kullanabilirsiniz .
Ipor Sircer

@Kishorepandey Bunu yapma. SHELLVarsa ortam değişkenini kullanın . Kullanıcı veritabanına bakmak size bir sonuç verecektir (kullanıcının giriş kabuğu) ama doğru sonuç olmayabilir (kullanıcının favori interaktif kabuğu) - kullanıcının yapılandırmasına bağlıdır.
Gilles 'SO- kötü olmayı kes'

19

Ortam değişkeni, SHELLher zaman çağıran kullanıcının varsayılan oturum açma kabuğuna genişler (değeri alır /etc/passwd).

Diğer herhangi bir kullanıcı için, bazı işlemler yapmanız gerekir /etc/passwd, işte basit bir awksnippet:

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

foobarGerçek kullanıcı adıyla değiştirin .

Varsa ldap(veya yerinde benzer bir şey) varsa, getentdoğrudan ayrıştırmak yerine veritabanını almak için kullanın /etc/passwd:

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

ya da en temiz yaklaşım, getentayrıştırma yapalım (@Kusalananda sayesinde):

getent passwd foobar | awk -F: '{print $NF}'

3
getent passwd foobarbelirli bir çizgiyle eşleşmek zorunda kalmamak için.
Kusalananda

Cevap için teşekkürler. Daha önce de bahsetmeliydim, hem Mac hem de Linux tabanlı sistemde çalışan bir yöntem arıyorum. Mac'te / etc / passwd kullanıcı bilgilerini içermez ve yalnızca tek bir kullanıcı modunda danışılır.
Spaniard89

4

Yana getentMacOS üzerinde standart bir komut değil, bir alt düzey kullanmak isteyebilir getpwuidmakine için yapılandırılmış adlandırma hizmetlerini danışacaktır çağrıyı. Bu, Unix benzeri platformların çoğunda oldukça yaygın olan perlveyapython

örneğin, geçerli kullanıcı için kabuk döndürülür:

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

2

Kullanıcının varsayılan kabuğunu aşağıdaki gibi ortamdan alabilirsiniz:

echo $SHELL

Ama böyle değil:

echo $0

İkincisi, komut dosyanızın şu anda hangi kabuğu kullandığını size söyleyecektir. Yukarıdaki ilk seçeneği istiyorsunuz.



0

Belki bu:

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

Bu zaten verilen cevapların hiçbirinde düzelmez.
Kusalananda

Ortak çalışmaları olan birden fazla kullanıcı varsa bu çalışmaz; örneğin eğer USER=fredo zaman bu maç olacak fred, frederick, alfred, alfredo...
Stephen Harris
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.