Descobrir o shell padrão de um usuário dentro de um script de shell

6

Eu queria saber se há 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 dentro de um script de shell.

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

Existe 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 explicitamente pedindo para usar o bash, as respostas postadas aqui sempre retorna o bash como esperado, embora eu esteja executando este script em um terminal ZSH.

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

Estou procurando uma solução que funcione tanto no Mac quanto em todo o bistrô baseado em Linux.

    
por Spaniard89 18.03.2017 / 16:25

6 respostas

5
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh
    
por 18.03.2017 / 16:32
11

A variável de ambiente, SHELL sempre se expande para o shell de login padrão do usuário solicitante (obtém o valor de /etc/passwd ).

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

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

Substitua foobar pelo nome de usuário real.

Se você tiver ldap (ou algo semelhante no lugar), use getent para 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, deixe getent fazer a análise (graças a @Kusalananda):

getent passwd foobar | awk -F: '{print $NF}'
    
por 18.03.2017 / 16:35
4

Como getent não é um comando padrão no MacOS, convém usar uma chamada getpwuid de nível inferior que consultará os serviços de nomeação para os quais a máquina está configurada. Isso pode exigir a chamada para perl ou python , que são bastante comuns na maioria das plataformas semelhantes a Unix

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

perl -e '@x=getpwuid($<); print $x[8]'
    
por 18.03.2017 / 17:01
1

Você pode obter o shell padrão do usuário no ambiente da seguinte forma:

echo $SHELL

Mas não assim:

echo $0

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

    
por 18.03.2017 / 17:43
0

Curto e indolor:

getent passwd <USER> | cut -d : -f 7
    
por 19.03.2017 / 11:24
0

Talvez isso:

   grep $USER </etc/passwd | cut -f 7 -d ":"
    
por 14.04.2017 / 13:32