GouthamM Asked: 2015-02-28 19:58:20 +0800 CST2015-02-28 19:58:20 +0800 CST 2015-02-28 19:58:20 +0800 CST 如何检查我使用的是哪个 shell? 772 我读到终端不过是 shell,而 Unix 提供了不同风格的 shell: 伯恩壳 (sh) C 外壳 (csh) TC 外壳 (tcsh) 玉米壳 (ksh) Bourne Again shell (bash) 问题: 当我打开终端窗口时,默认打开哪个 shell? 如何检查安装了多少个 shell? 如何更改我的帐户使用的 shell? command-line 9 个回答 Voted Best Answer kingmilo 2015-02-28T20:03:08+08:002015-02-28T20:03:08+08:00 您可以在终端中键入以下命令以查看您使用的是哪个 shell: echo $0 如果您使用的是bash ( Bourne Again Shell ) 终端,结果将类似于以下内容: -bash heemayl 2015-02-28T20:06:26+08:002015-02-28T20:06:26+08:00 要在默认环境中找到您拥有的 shell,您可以检查SHELL环境变量的值: echo $SHELL 要查找当前 shell 实例,请查找具有当前 shell 实例 PID 的进程(shell)。 要查找当前 shell 实例的 PID: echo "$$" 现在找到具有 PID 的进程: ps -p <PID> 把它放在一起: ps -p "$$" thenakulchawla 2016-11-19T03:45:48+08:002016-11-19T03:45:48+08:00 $SHELL给你默认的外壳。 $0给你当前的外壳。 例如:我将 bash 作为我的默认 shell,用于我的终端应用程序。但是对于我的 iTerm2 应用程序,我在窗口打开时使用命令:/bin/ksh。 所以我 $0给了我/bin/kshiTerm2。 在 iTerm2 上 $SHELL给我。,在终端给我/bin/bash$0$SHELL/bin/bash Evan Benn 2018-04-06T20:00:01+08:002018-04-06T20:00:01+08:00 其他答案倾向于使用特定于 shell 的功能,但我们正试图发现我们使用的是哪个 shell,因此他们假设了问题的答案。例如,所有答案都不适用于鱼。 sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p 而是在 sh 的调用中使用 $$ 语法,但我们正在寻找 PPID 而不是 PID。使用 PPID 查找 cmd。 sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe' 感谢@muru 的改进 kos 2015-02-28T20:02:38+08:002015-02-28T20:02:38+08:00 要知道哪个是您的用户的默认 shell,您可以运行: echo "$SHELL" 例如,如果你使用 Bash,你应该得到以下输出: /bin/bash 如果你没有更改任何配置,它应该是 Bash,因为 Bash 是 Ubuntu 上的默认 shell。 Michael D 2018-11-08T03:54:04+08:002018-11-08T03:54:04+08:00 原帖问了三个问题。给出的答案涵盖了第一个问题,“当我打开终端窗口时,默认打开哪个 shell?” 他们还回答了一个没有被问到的问题,即“我怎样才能找出终端中当前正在运行的 shell?” 然而,据我所知,没有人回答最初提出的第二个或第三个问题,即“我如何检查安装了多少个 shell?” 和“如何更改我帐户中使用的 shell?” 回答“我如何检查安装了多少外壳?” 以下命令将列出所有可用的 shell: cat /etc/shells 例如,在 Ubuntu 18.10 的默认安装中,这给出了: # /etc/shells: valid login shells /bin/sh /bin/dash /bin/bash /bin/rbash 但是,默认情况下 sh 是指向 dash 的符号链接,而 rbash 使用选项 -r(“受限的 bash”)链接到 bash,因此实际上只有两个 shell,而不是上面列表所建议的四个。以下命令将向您显示列出的任何 shell 实际上是否是符号链接,如果是,它们链接到的位置:ls -l /bin 现在的问题是“如何更改我帐户中使用的 shell?” 假设这意味着“我如何永久更改终端将使用的默认 shell”,这里有一个答案。 Greenonline 2021-01-30T04:08:54+08:002021-01-30T04:08:54+08:00 要解决您的第三个问题,“如何更改我帐户中使用的 shell?”,答案是使用chsh. 有两种模式: 互动,以及; 非互动。 从Changing Shells - Changing your login shell which is permanent,并稍微解释一下: 您将使用一个名为chsh的程序。有交互方式和非交互方式。在您的终端中输入以下内容: 互动方式 $ chsh 这会产生一个简短的对话框,其中首先提示用户输入密码,然后提示所需新 shell 的完整路径。 更改默认 shell 时应谨慎,因为可能会出现只有 root 用户(即系统管理员)才能修复的错误(尽管熟练的用户在家庭系统上修复它应该很容易)。特别重要的是,首先在当前会话中临时测试 shell,然后确保在进行永久更改时输入的是有效的 shell 名称。 非交互式方法 我将再次使用 csh 作为示例。 $ chsh -s /bin/csh -s无需进入编辑器即可为您设置。 一旦执行成功,thenecho $SHELL仍然会说你和以前一样在同一个 shell 中。但是,您需要注销并重新登录才能使更改生效。现在做echo $SHELL。您应该看到它显示了新的 shell。 MikeBeaton 2021-07-03T00:36:51+08:002021-07-03T00:36:51+08:00 您可能不想知道当前 shell 的名称(例如-bash、bash、zsh等, from echo $0),也不想知道默认 shell 的可执行路径( from echo $SHELL),而是当前 shell 的可执行路径(特别有用,例如,如果您有多个版本的 Bash安装)。 为此,您可以使用lsof -p "$$"或 一些额外的编码来提取所需的信息: lsof -p "$$" | grep -m 1 txt | xargs -n 1 | tail -n 1 通过 Homebrew 安装的 Bash 的示例输出: /usr/local/Cellar/bash/5.1.8/bin/bash 或者对于 Zsh: /bin/zsh 上面与 不同echo $SHELL,因为上面是针对当前正在运行的 shell 而不是用户的默认 shell,还因为上面给出了任何符号链接展开后的可执行文件。例如,对于与上面相同的 Bash 安装,echo $SHELL给出/usr/local/bin/bash. 编辑:如果您需要在 shell 的路径中允许可能的空格字符,请lsof -p "$$" | grep -m 1 txt | xargs -n 1 | tail -n +9 | xargs改用。 golimar 2019-11-05T04:11:07+08:002019-11-05T04:11:07+08:00 在我连接的其中一台服务器中,登录 shell/bin/sh是一个符号链接/bin/bash 这里的大多数答案都会给出sh,这会让 OP 认为它是 Bourne shell 而不是 GNU bash,除了这个给出/bin/bash 适用于这种情况的另一个选项是: $ echo $SHELL /bin/sh $ ls -l /bin/sh lrwxrwxrwx 1 root root 4 May 31 16:15 /bin/sh -> bash $ /bin/sh --help GNU bash, version 4.2.10(1) Usage: /bin/sh [GNU long option] [option] ... /bin/sh [GNU long option] [option] script-file ...
您可以在终端中键入以下命令以查看您使用的是哪个 shell:
如果您使用的是bash ( Bourne Again Shell ) 终端,结果将类似于以下内容:
要在默认环境中找到您拥有的 shell,您可以检查
SHELL
环境变量的值:要查找当前 shell 实例,请查找具有当前 shell 实例 PID 的进程(shell)。
要查找当前 shell 实例的 PID:
现在找到具有 PID 的进程:
把它放在一起:
$SHELL
给你默认的外壳。$0
给你当前的外壳。例如:我将 bash 作为我的默认 shell,用于我的终端应用程序。但是对于我的 iTerm2 应用程序,我在窗口打开时使用命令:
/bin/ksh
。所以我
$0
给了我/bin/ksh
iTerm2。 在 iTerm2 上$SHELL
给我。,在终端给我/bin/bash
$0
$SHELL
/bin/bash
其他答案倾向于使用特定于 shell 的功能,但我们正试图发现我们使用的是哪个 shell,因此他们假设了问题的答案。例如,所有答案都不适用于鱼。
而是在 sh 的调用中使用 $$ 语法,但我们正在寻找 PPID 而不是 PID。使用 PPID 查找 cmd。
感谢@muru 的改进
要知道哪个是您的用户的默认 shell,您可以运行:
例如,如果你使用 Bash,你应该得到以下输出:
如果你没有更改任何配置,它应该是 Bash,因为 Bash 是 Ubuntu 上的默认 shell。
原帖问了三个问题。给出的答案涵盖了第一个问题,“当我打开终端窗口时,默认打开哪个 shell?” 他们还回答了一个没有被问到的问题,即“我怎样才能找出终端中当前正在运行的 shell?” 然而,据我所知,没有人回答最初提出的第二个或第三个问题,即“我如何检查安装了多少个 shell?” 和“如何更改我帐户中使用的 shell?”
回答“我如何检查安装了多少外壳?” 以下命令将列出所有可用的 shell:
例如,在 Ubuntu 18.10 的默认安装中,这给出了:
但是,默认情况下 sh 是指向 dash 的符号链接,而 rbash 使用选项 -r(“受限的 bash”)链接到 bash,因此实际上只有两个 shell,而不是上面列表所建议的四个。以下命令将向您显示列出的任何 shell 实际上是否是符号链接,如果是,它们链接到的位置:ls -l /bin
现在的问题是“如何更改我帐户中使用的 shell?” 假设这意味着“我如何永久更改终端将使用的默认 shell”,这里有一个答案。
要解决您的第三个问题,“如何更改我帐户中使用的 shell?”,答案是使用
chsh
.有两种模式:
从Changing Shells - Changing your login shell which is permanent,并稍微解释一下:
您可能不想知道当前 shell 的名称(例如
-bash
、bash
、zsh
等, fromecho $0
),也不想知道默认 shell 的可执行路径( fromecho $SHELL
),而是当前 shell 的可执行路径(特别有用,例如,如果您有多个版本的 Bash安装)。为此,您可以使用
lsof -p "$$"
或 一些额外的编码来提取所需的信息:通过 Homebrew 安装的 Bash 的示例输出:
或者对于 Zsh:
上面与 不同
echo $SHELL
,因为上面是针对当前正在运行的 shell 而不是用户的默认 shell,还因为上面给出了任何符号链接展开后的可执行文件。例如,对于与上面相同的 Bash 安装,echo $SHELL
给出/usr/local/bin/bash
.编辑:如果您需要在 shell 的路径中允许可能的空格字符,请
lsof -p "$$" | grep -m 1 txt | xargs -n 1 | tail -n +9 | xargs
改用。在我连接的其中一台服务器中,登录 shell
/bin/sh
是一个符号链接/bin/bash
这里的大多数答案都会给出
sh
,这会让 OP 认为它是 Bourne shell 而不是 GNU bash,除了这个给出/bin/bash
适用于这种情况的另一个选项是: