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.

Espagnol89
la source
@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
Ipor Sircer
la source
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}'
heemayl
la source
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]'
Stephen Harris
la source
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.

Alxs
la source
0

Court et indolore:

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

Peut être ça:

   grep $USER </etc/passwd | cut -f 7 -d ":"
user226946
la source
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