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.


@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

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

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

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.



0

Talvez isto:

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.