我正在编写一个.sh脚本,在某些时候,会将用户的shell更改为/ bin / zsh。该命令当然如下:
chsh -s /bin/zsh
但是这会询问用户的密码,如果当前用户的shell还不是/bin/zsh
,我只想执行它。为此我需要一个让我知道当前shell的命令,并将其与"/bin/zsh"
或类似的东西进行比较。我发现有一个c getusershell
函数,但是没有办法从shell脚本中知道这个吗?
更新:抱歉,我的意思是用户指定为首选shell的shell。是的,/etc/passwd
中指定的那个。这背后的逻辑是,脚本即将将用户首选的shell更改为zsh,我只想让脚本首先检查它是否已经是zsh。
答案 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 -c
,pwget -n
和dscl ...
)所以如果这些操作系统应该增强这个命令需要得到支持。
答案 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")'
一元+
运算符或额外括号的原因相当模糊。