我们可以运行类似chsh -s /usr/local/bin/zsh
设置一个新的默认外壳的东西。有没有我们可以运行的命令来知道那个 shell 是什么?
我的意思不是让终端打开并运行命令来知道我们在哪个 shell。我的意思是像上面的例子一样,如果我在一个打开的终端中,如果它是当前的/bin/bash
,我应该运行什么/usr/local/bin/zsh
默认外壳?
您可以使用以下命令:
echo $SHELL
对于 macOS:
dscl . -read /Users/username UserShell
对于当前的 macOS 用户:
dscl . -read ~/ UserShell
要使用以下方式解析路径sed
:
dscl . -read ~/ UserShell | sed 's/UserShell: //'
Using$SHELL
将报告当前的登录 shell,而不是默认的登录 shell。在某些情况下,这些并不相同。例如,当在诸如 Visual Studio Code 之类的 IDE 中工作时,它会打开集成终端而无需咨询默认 shell。
此外,正如 Martin C. Martin 所指出的,是一个常量,在更改默认登录 shell$SHELL
后不会更改。chsh
您可以在 /etc/passwd 文件中 grep 获取当前用户名,并使用 cut 提取相应的信息列:
grep ^$(id -un): /etc/passwd | cut -d : -f 7-
$(id -un)
比$USER
获取用户名更安全。^
如果您的用户名是其他用户名的子部分,则在用户名之前和之后使用:
可确保您不会得到错误匹配。
$SHELL
也可以按照建议使用。chsh
但是,如果在当前 shell 中使用它将不起作用,因为变量没有更新。此外,该变量不受保护以防被更改,因此理论上可以将其设置为完全不同的东西。
更新以尝试兼容 OS X 的解决方案。可能不是最佳的正则表达式:
grep ^.*:.*:$(id -u): /etc/passwd | cut -d : -f 7-
这是基于用户 ID 的。如果整个用户条目丢失,不仅是用户名,那么 osx 必须将其存储在其他地方。
如果要获取用户的默认 shell,可以使用grep file /etc/passwd
。喜欢:
grep "$USER" /etc/passwd
# kent:x:1000:1000::/home/kent:/bin/zsh
告诉我当前用户 (kent) 有默认的 shell /bin/zsh
。
如果您只想捕获外壳部分:
awk -F: -v u="$USER" 'u==$1&&$0=$NF' /etc/passwd
# /bin/zsh
如果要获取其他用户的默认 shell,只需替换 $USER 部分。
在 OS X 中,使用该命令env | grep -i 'SHELL'
会产生如下输出:(SHELL=/bin/sh
以 root 身份,但普通用户倾向于将 /bin/bash 作为默认 shell)稍加解析,shell 的路径(以及 shell 本身)可能很容易从那里识别和提取..