9

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

chsh -s /bin/zsh

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

更新:对不起,我的意思是用户指定为他首选的 shell。所以是的,在/etc/passwd. 这背后的逻辑是,脚本即将将用户的首选 shell 更改为 zsh,我只想让脚本先检查它是否还不是 zsh。

4

6 回答 6

15

$SHELL返回当前用户的 shell:

$ echo $SHELL
/bin/zsh
于 2013-06-05T15:23:26.977 回答
5

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

我会用这个:

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

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

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

于 2013-06-05T17:56:57.347 回答
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和相应的手册页)。

于 2013-06-05T15:21:57.987 回答
1

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

ps -p $$
于 2013-06-05T15:25:21.470 回答
0

以下作品:

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

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

于 2013-06-05T15:35:42.043 回答
0
perl -e '@pw = getpwuid $< ; print $pw[8], "\n"'

这假设 Perl 已安装、正确配置并且在您$PATH的 . (这可能是一个比getent可用的更安全的赌注,或者用户信息实际上存储在/etc/passwd文件中,或者 的值$SHELL没有改变。)

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

上面可以稍微缩短为:

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

或者

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

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

于 2013-06-05T19:21:41.910 回答