39

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

我的意思不是让终端打开并运行命令来知道我们在哪个 shell。我的意思是像上面的例子一样,如果我在一个打开的终端中,如果它是当前的/bin/bash,我应该运行什么/usr/local/bin/zsh默认外壳?

4

5 回答 5

47

您可以使用以下命令:

echo $SHELL
于 2013-05-04T14:55:11.730 回答
29

对于 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

于 2017-01-09T17:11:21.593 回答
4

您可以在 /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 必须将其存储在其他地方。

于 2013-05-04T15:01:53.943 回答
1

如果要获取用户的默认 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 部分。

于 2013-05-04T14:54:24.983 回答
0

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

于 2014-11-20T18:51:00.067 回答