Descobrindo o shell padrão de um usuário em um script de shell

10

Eu queria saber se existe uma maneira de descobrir o shell padrão do usuário atual dentro de um script de shell?

Caso de uso: Estou trabalhando em um script que define um alias para um comando e esse alias é definido em um script de shell.

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

Há uma lógica no script em que ele tenta encontrar o shell padrão do usuário que executa o script e adiciona esse alias no respectivo arquivo ~ / .bashrc ou ~ / .zshrc

Mas, como estou adicionando um shebang na frente do script e solicitando explicitamente que ele use o bash, as respostas postadas aqui sempre retornam o bash conforme o esperado, embora eu esteja executando esse script em um terminal ZSH.

Existe uma maneira de obter o tipo de shell em que o script é executado independentemente do conjunto de shebang?

Estou procurando uma solução que funcione no Mac e em todos os bistrôs baseados em Linux.

Espanhol89
fonte
@StephenRauch Eu deveria ter mencionado isso antes, estou procurando um método que funcione no sistema baseado em Mac e Linux. O arquivo / etc / passwd no Mac não contém as informações do usuário e é consultado apenas em um único modo de usuário.
Spaniard89
O que /etc/passwdtem no OSX? Eu dei uma rápida olhada online e parece que o shell está lá, mas não o nome de usuário. O ID do usuário ainda está lá, por que você não usa isso?
terdon
Gostaria de saber se é possível ter uma lista exaustiva de conchas. Ou todos os arquivos de inicialização do shell sempre estão em conformidade com. {Name_of_shell} rc?
Jamesqf 18/03/19

Respostas:

6
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh
Ipor Sircer
fonte
Obrigado, funciona como um encanto! Esta é a única solução que provavelmente funciona para bistrôs baseados em mac e linux.
Spaniard89
1
BTW, editei um pouco o comando para torná-lo independente de todos os sistemas operacionais, finger $USER | grep 'Shell:*' | cut -f3 -d ":"pois as opções grep -P não são suportadas no Mac.
Spaniard89
2
Observe que fingerpode não estar instalado em todas as máquinas. É um pacote opcional em sistemas baseados em RedHat.
Stephen Harris
1
@ Kishorepandey: você pode usar em getent|grep ^$USER:|cut -f: -f7vez do dedo, se o dedo não estiver instalado por padrão.
Ipor Sircer 18/03/19
@Kishorepandey Não faça isso. Use a SHELLvariável de ambiente, se estiver presente. Observar o banco de dados do usuário fornecerá um resultado (o shell de login do usuário), mas pode não ser o resultado correto (o shell interativo favorito do usuário) - depende da configuração do usuário.
Gilles 'SO- stop be evil'
19

A variável de ambiente SHELLsempre se expande para o shell de login padrão do usuário que está chamando (obtém o valor de /etc/passwd).

Para qualquer outro usuário, você precisa fazer algum processamento com /etc/passwd, aqui está um awktrecho simples :

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

Substitua foobarpelo nome de usuário real.

Se você possui ldap(ou algo semelhante), use getentpara obter o banco de dados em vez de analisar diretamente /etc/passwd:

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

ou abordagem mais limpa, getentfaça a análise (graças a @Kusalananda):

getent passwd foobar | awk -F: '{print $NF}'
heemail
fonte
3
getent passwd foobarpara ignorar a necessidade de corresponder a uma linha específica.
Kusalananda
Obrigado pela resposta. Eu deveria ter mencionado isso antes, estou procurando um método que funcione no sistema baseado em Mac e Linux. O arquivo / etc / passwd no Mac não contém as informações do usuário e é consultado apenas em um único modo de usuário.
Spaniard89
4

Como getentnão é um comando padrão no MacOS, convém usar uma getpwuidchamada de nível inferior que consulte os serviços de nomes para os quais a máquina está configurada. Isso pode exigir a chamada perlou python, o que é bastante comum na maioria das plataformas semelhantes ao Unix

Por exemplo, isso retornará o shell para o usuário atual:

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

Você pode obter o shell padrão do usuário no ambiente como este:

echo $SHELL

Mas não é assim:

echo $0

O último dirá apenas qual shell seu script está usando no momento. Então você quer a primeira opção acima.

Alxs
fonte
0

Curto e indolor:

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

Talvez isto:

   grep $USER </etc/passwd | cut -f 7 -d ":"
user226946
fonte
Isso não melhora em nenhuma das respostas já fornecidas.
Kusalananda
Isso não funcionará se houver vários usuários com trabalhos em comum; por exemplo, se USER=fred, então isso vai corresponder fred, frederick, alfred, alfredo...
Stephen Harris