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.
fonte
/etc/passwd
tem 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?Respostas:
fonte
finger $USER | grep 'Shell:*' | cut -f3 -d ":"
pois as opções grep -P não são suportadas no Mac.finger
pode não estar instalado em todas as máquinas. É um pacote opcional em sistemas baseados em RedHat.getent|grep ^$USER:|cut -f: -f7
vez do dedo, se o dedo não estiver instalado por padrão.SHELL
variá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.A variável de ambiente
SHELL
sempre 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á umawk
trecho simples :Substitua
foobar
pelo nome de usuário real.Se você possui
ldap
(ou algo semelhante), usegetent
para obter o banco de dados em vez de analisar diretamente/etc/passwd
:ou abordagem mais limpa,
getent
faça a análise (graças a @Kusalananda):fonte
getent passwd foobar
para ignorar a necessidade de corresponder a uma linha específica.Como
getent
não é um comando padrão no MacOS, convém usar umagetpwuid
chamada de nível inferior que consulte os serviços de nomes para os quais a máquina está configurada. Isso pode exigir a chamadaperl
oupython
, o que é bastante comum na maioria das plataformas semelhantes ao UnixPor exemplo, isso retornará o shell para o usuário atual:
fonte
Você pode obter o shell padrão do usuário no ambiente como este:
Mas não é assim:
O último dirá apenas qual shell seu script está usando no momento. Então você quer a primeira opção acima.
fonte
Curto e indolor:
fonte
Talvez isto:
fonte
USER=fred
, então isso vai corresponderfred
,frederick
,alfred
,alfredo
...