确定当前用户的shell

时间:2013-06-05 15:18:43

标签: shell

我正在编写一个.sh脚本,在某些时候,会将用户的shell更改为/ bin / zsh。该命令当然如下:

chsh -s /bin/zsh

但是这会询问用户的密码,如果当前用户的shell还不是/bin/zsh,我只想执行它。为此我需要一个让我知道当前shell的命令,并将其与"/bin/zsh"或类似的东西进行比较。我发现有一个c getusershell函数,但是没有办法从shell脚本中知道这个吗?

更新:抱歉,我的意思是用户指定为首选shell的shell。是的,/etc/passwd中指定的那个。这背后的逻辑是,脚本即将将用户首选的shell更改为zsh,我只想让脚本首先检查它是否已经是zsh。

6 个答案:

答案 0 :(得分:15)

$SHELL返回当前用户的shell:

$ echo $SHELL
/bin/zsh

答案 1 :(得分:4)

您不应该假设/etc/passwd是用户shell存储的位置。

我会用这个:

getent passwd $(id -un) | awk -F : '{print $NF}'

编辑:请注意,getent仅在Solaris,BSD和基于GNU / Linux的操作系统上实现。

AIX,HP-UX和OS X有自己的方法来做类似的事情(分别为lsusers -cpwget -ndscl ...)所以如果这些操作系统应该增强这个命令需要得到支持。

答案 2 :(得分:2)

$ awk -F: '$1 == "myusername" {print $NF}' /etc/passwd
/bin/zsh

或者,如果您在shell变量var中有用户名:

awk -F: -v u=$var '$1 == u {print $NF}' /etc/passwd

这假定/etc/passwd在本地完成(与提供NIS相反;请参阅您的/etc/nsswitch.conf和相应的手册页。)

答案 3 :(得分:2)

以下命令将为您提供当前shell(在CMD单元格中):

ps -p $$

答案 4 :(得分:0)

以下作品:

ps p $$ | awk '{print $5}'

有时$ SHELL和/ etc / passwd中的值不正确。

答案 5 :(得分:0)

perl -e '@pw = getpwuid $< ; print $pw[8], "\n"'

这假设Perl已安装,配置正确,并且在$PATH中,这在大多数现代类Unix系统上是相当安全的。 (这可能比getent可用更安全,或者用户信息实际存储在/etc/passwd文件中,或者$SHELL的值未更改。)< / p>

$<是当前进程的真实UID。 getpwuid()返回/etc/passwd 中的值数组,无论系统使用何种其他机制(NIS,LDAP)。该数组的元素8是用户的登录shell。

以上内容可略微缩短为:

perl -e 'print +(getpwuid $<)[8], "\n"'

perl -e 'print((getpwuid $<)[8], "\n")'

一元+运算符或额外括号的原因相当模糊。