如何获取默认shell

时间:2013-05-04 14:47:10

标签: macos shell

我们可以运行chsh -s /usr/local/bin/zsh之类的东西来设置新的默认shell。是否有一个命令我们可以运行来知道那个shell是什么?

我不是说终端打开并运行命令来了解我们所在的shell,我的意思是在上面的示例中,如果我在一个/bin/bash开放的终端中,应该怎么做如果它是当前的默认shell,我会跑去获取/usr/local/bin/zsh吗?

5 个答案:

答案 0 :(得分:26)

您可以使用以下命令echo $SHELL

答案 1 :(得分:10)

对于macOS:

dscl . -read /Users/username UserShell

对于当前的macOS用户:

dscl . -read ~/ UserShell

使用sed

解析内联路径
dscl . -read ~/ UserShell | sed 's/UserShell: //'

使用$SHELL将报告当前的登录shell,而不是默认的登录shell。在某些情况下,这些不一样。例如,在Visual Studio Code等IDE中工作时,它会在不咨询默认shell的情况下打开集成终端。

此外,正如Martin C. Martin所指出的,$SHELL是一个常量,在chsh更改默认登录shell后不会改变。

答案 2 :(得分:4)

您可以在/ etc / passwd文件中grep获取当前用户名,并使用cut提取相应的信息列:

grep ^$(id -un): /etc/passwd | cut -d : -f 7-
获取用户名

$(id -un)$USER更安全。如果您的用户名是其他用户名的子部分,请在用户名前面使用^,然后使用:,确保不会出现错误匹配。

如建议的那样,也可以使用

$SHELL。但是,如果在当前shell中使用chsh,它将无法工作,因为变量未更新。此外,变量不受保护,不会被改变,因此理论上它可以设置为完全不同的东西。

更新以尝试与OS X兼容的解决方案。可能不是最佳正则表达式:

grep ^.*:.*:$(id -u): /etc/passwd | cut -d : -f 7-

这是基于用户ID的。如果缺少整个用户条目,不仅仅是用户名,那么osx必须将其存储在其他地方。

答案 3 :(得分:1)

如果你想获得用户的默认shell,你可以grep /etc/passwd。像:

kent$  grep "$USER" /etc/passwd
kent:x:1000:1000::/home/kent:/bin/zsh

告诉我当前用户(肯特)有默认的shell /bin/zsh

如果你只想抓住shell部分:

kent$  awk -F: -v u="$USER" 'u==$1&&$0=$NF' /etc/passwd
/bin/zsh

如果您想获得其他用户的默认shell,只需替换$ USER部分。

答案 4 :(得分:-1)

在OS X中,使用命令env | grep -i 'SHELL'生成输出,例如:SHELL=/bin/sh (作为root,但普通用户倾向于将/ bin / bash作为默认shell)并进行一些解析,shell(以及shell本身)的路径可以很容易地从那里识别和提取..