我们可以运行chsh -s /usr/local/bin/zsh
之类的东西来设置新的默认shell。是否有一个命令我们可以运行来知道那个shell是什么?
我不是说终端打开并运行命令来了解我们所在的shell,我的意思是在上面的示例中,如果我在一个/bin/bash
开放的终端中,应该怎么做如果它是当前的默认shell,我会跑去获取/usr/local/bin/zsh
吗?
答案 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本身)的路径可以很容易地从那里识别和提取..