Connaître le shell par défaut d'un utilisateur dans un script shell


10

Je me demandais s'il y avait un moyen de découvrir le shell par défaut de l'utilisateur actuel dans un script shell?

Cas d'utilisation: je travaille sur un script qui définit un alias pour une commande et cet alias est défini dans un script shell.

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

Il y a une logique dans le script où il essaie de trouver le shell par défaut de l'utilisateur qui exécute le script et ajoute cet alias dans le fichier ~ / .bashrc ou ~ / .zshrc respectif

Mais comme j'ajoute un shebang à l'avant du script et que je lui demande explicitement d'utiliser bash, les réponses publiées ici renvoient toujours bash comme prévu bien que j'exécute ce script sur un terminal ZSH.

Existe-t-il un moyen d'obtenir le type de shell où le script est exécuté indépendamment de l'ensemble de shebang?

Je suis à la recherche d'une solution qui fonctionne à la fois sur Mac et sur tous les bistro basés sur Linux.


@StephenRauch J'aurais dû le mentionner plus tôt, je recherche une méthode qui fonctionne à la fois sur un système Mac et Linux. / etc / passwd sur Mac ne contient pas les informations utilisateur et n'est consulté qu'en mode mono-utilisateur.
Espagnol89

Qu'a-t /etc/passwd-il sur OSX? J'ai jeté un coup d'œil en ligne et il semble que le shell soit là, mais pas le nom d'utilisateur. L'ID utilisateur est toujours là, pourquoi ne l'utilisez-vous pas?
terdon

Je me demande s'il est même possible d'avoir une liste exhaustive des obus. Ou tous les fichiers de démarrage du shell sont-ils toujours conformes à. {Name_of_shell} rc?
jamesqf

Réponses:


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

Merci ça marche comme un charme! C'est la seule solution qui fonctionne probablement pour les bistrots basés sur mac et linux.
Espagnol89

1
BTW, j'ai un peu modifié la commande pour la rendre agnostique pour tous les OS finger $USER | grep 'Shell:*' | cut -f3 -d ":"car les options grep -P ne sont pas prises en charge sur Mac.
Espagnol89

2
Notez que fingerpeut ne pas être installé sur toutes les machines. Il s'agit d'un package facultatif sur les systèmes basés sur RedHat.
Stephen Harris

1
@Kishorepandey: vous pouvez utiliser à la getent|grep ^$USER:|cut -f: -f7place de finger, si finger n'est pas installé par défaut.
Ipor Sircer

@Kishorepandey Ne fais pas ça. Utilisez la SHELLvariable d'environnement si elle est présente. La consultation de la base de données utilisateur vous donnera un résultat (le shell de connexion de l'utilisateur) mais ce ne sera peut-être pas le bon résultat (le shell interactif préféré de l'utilisateur) - cela dépend de la configuration de l'utilisateur.
Gilles 'SO- arrête d'être méchant'

19

La variable d'environnement SHELLserait toujours étendue au shell de connexion par défaut de l'utilisateur appelant (obtient la valeur de /etc/passwd).

Pour tout autre utilisateur donné, vous devez effectuer un traitement avec /etc/passwd, voici un simple awkextrait:

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

Remplacez foobarpar le nom d'utilisateur réel.

Si vous en avez ldap(ou quelque chose de similaire en place), utilisez getentpour obtenir la base de données au lieu d'analyser directement /etc/passwd:

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

ou approche la plus propre, laissez getentfaire l'analyse (grâce à @Kusalananda):

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

3
getent passwd foobarpour éviter d'avoir à faire correspondre une ligne particulière.
Kusalananda

Merci d'avoir répondu. J'aurais dû le mentionner plus tôt, je cherche une méthode qui fonctionne à la fois sur un système Mac et Linux. / etc / passwd sur Mac ne contient pas les informations utilisateur et n'est consulté qu'en mode mono-utilisateur.
Espagnol89

4

Étant donné qu'il getentne s'agit pas d'une commande standard sur MacOS, vous souhaiterez peut-être utiliser un getpwuidappel de niveau inférieur qui consultera les services de dénomination pour lesquels la machine est configurée. Cela peut nécessiter d'appeler perlou python, qui sont assez courants sur la plupart des plates-formes de type Unix

par exemple, cela retournera le shell pour l'utilisateur actuel:

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

2

Vous pouvez obtenir le shell par défaut de l'utilisateur à partir de l'environnement comme ceci:

echo $SHELL

Mais pas comme ça:

echo $0

Ce dernier vous dira simplement quel shell votre script utilise actuellement. Vous voulez donc la première option ci-dessus.



0

Peut être ça:

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

Cela n'améliore aucune des réponses déjà données.
Kusalananda

Cela ne fonctionnera pas s'il y a plusieurs utilisateurs avec des œuvres en commun; par exemple , si USER=fredalors cela correspond fred, frederick, alfred, alfredo...
Stephen Harris
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.