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.
la source
/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?Réponses:
la source
finger $USER | grep 'Shell:*' | cut -f3 -d ":"
car les options grep -P ne sont pas prises en charge sur Mac.finger
peut ne pas être installé sur toutes les machines. Il s'agit d'un package facultatif sur les systèmes basés sur RedHat.getent|grep ^$USER:|cut -f: -f7
place de finger, si finger n'est pas installé par défaut.SHELL
variable 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.La variable d'environnement
SHELL
serait 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 simpleawk
extrait:Remplacez
foobar
par le nom d'utilisateur réel.Si vous en avez
ldap
(ou quelque chose de similaire en place), utilisezgetent
pour obtenir la base de données au lieu d'analyser directement/etc/passwd
:ou approche la plus propre, laissez
getent
faire l'analyse (grâce à @Kusalananda):la source
getent passwd foobar
pour éviter d'avoir à faire correspondre une ligne particulière.Étant donné qu'il
getent
ne s'agit pas d'une commande standard sur MacOS, vous souhaiterez peut-être utiliser ungetpwuid
appel de niveau inférieur qui consultera les services de dénomination pour lesquels la machine est configurée. Cela peut nécessiter d'appelerperl
oupython
, qui sont assez courants sur la plupart des plates-formes de type Unixpar exemple, cela retournera le shell pour l'utilisateur actuel:
la source
Vous pouvez obtenir le shell par défaut de l'utilisateur à partir de l'environnement comme ceci:
Mais pas comme ça:
Ce dernier vous dira simplement quel shell votre script utilise actuellement. Vous voulez donc la première option ci-dessus.
la source
Court et indolore:
la source
Peut être ça:
la source
USER=fred
alors cela correspondfred
,frederick
,alfred
,alfredo
...