bash - 如何确定我所在的当前交互式 shell(命令行)

标签 bash unix shell csh tcsh

如何确定我正在使用的当前 shell?

单独使用 ps 命令的输出是否足够?

如何在不同风格的 Unix 中做到这一点?

最佳答案

  • 可以通过三种方法找到当前 shell 可执行文件的名称:

    请注意,如果 shell 的可执行文件是 /bin/sh,那么这三种方法都可能被愚弄,但它实际上是重命名的 bash,例如(经常发生)。

    因此,关于 ps 输出是否可行的第二个问题的答案是“not always”。

    1. echo $0 - 将打印程序名称...在 shell 的情况下是实际的 shell。

    2. ps -ef | grep $$ | grep -v grep - 这将在正在运行的进程列表中查找当前进程 ID。由于当前进程是shell,所以会被包含进来。

      这不是 100% 可靠,因为您可能有 其他 进程,其 ps 列表包含与 shell 进程 ID 相同的数字,特别是如果该 ID 是一个小数字(例如,如果 shell 的 PID 是“5”,您可能会在相同的 grep 输出中找到名为“java5”或“perl5”的进程!)。 除了不能依赖 shell 名称之外,这是“ps”方法的第二个问题。

    3. echo $SHELL - 当前 shell 的路径存储为任何 shell 的 SHELL 变量。需要注意的是,如果您将 shell 明确地作为子进程启动(例如,它不是您的登录 shell),您将获得登录 shell 的值。如果可能的话,请使用 ps$0 方法。


  • 但是,如果可执行文件与您的实际 shell 不匹配(例如 /bin/sh 实际上是 bash 或 ksh),您需要试探法。以下是一些特定于各种 shell 的环境变量:

    • $version 在 tcsh 上设置

    • $BASH 在 bash 上设置

    • $shell(小写)设置为 csh 或 tcsh 中的实际 shell 名称

    • $ZSH_NAME 在 zsh 上设置

    • ksh 设置了 $PS3$PS4,而普通的 Bourne shell (sh) 只有 $ PS1$PS2 设置。这通常看起来是最难区分的 - 我们在 Solaris boxen 上安装的 shksh 之间整个环境变量集的唯一 区别是$ERRNO$FCEDIT$LINENO$PPID$PS3$PS4$RANDOM$SECONDS$TMOUT

关于bash - 如何确定我所在的当前交互式 shell(命令行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34774913/

相关文章:

c - posix 线程(pthread_create 和 pthread_join)

bash - Bash shell 中的 ${var}、 "$var"和 "${var}"之间有什么区别?

macos - 在 Bash 中获取在 Mac OS X 上运行的应用程序列表?

linux - 使用 'find' 返回不带扩展名的文件名

linux - 如何在终端中启动命令,就像我打开终端并输入命令一样

unix - 使用 awk 计算意外值

bash - 在 bash 中计算一行中的逗号

ruby - 无法在 Mac OS X Lion 上安装 RVM

windows - 在 Cygwin 中获取 Windows 版本

bash - 在 Bash 中检查文件夹大小