AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 590899
Accepted
GouthamM
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 9 个回答
  • 715915 Views

9 个回答

  • Voted
  1. Best Answer
    kingmilo
    2015-02-28T20:03:08+08:002015-02-28T20:03:08+08:00

    您可以在终端中键入以下命令以查看您使用的是哪个 shell:

    echo $0
    

    如果您使用的是bash ( Bourne Again Shell ) 终端,结果将类似于以下内容:

    -bash
    
    • 685
  2. 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 "$$"
    
    • 190
  3. 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

    • 54
  4. 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 的改进

    • 20
  5. kos
    2015-02-28T20:02:38+08:002015-02-28T20:02:38+08:00

    要知道哪个是您的用户的默认 shell,您可以运行:

    echo "$SHELL"
    

    例如,如果你使用 Bash,你应该得到以下输出:

    /bin/bash
    

    如果你没有更改任何配置,它应该是 Bash,因为 Bash 是 Ubuntu 上的默认 shell。

    • 11
  6. 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”,这里有一个答案。

    • 11
  7. 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。

    • 1
  8. 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改用。

    • 1
  9. 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 ...
    
    • 0

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve