如何确定我正在使用的当前 shell?
单独使用 ps
命令的输出是否足够?
如何在不同风格的 Unix 中做到这一点?
最佳答案
可以通过三种方法找到当前 shell 可执行文件的名称:
请注意,如果 shell 的可执行文件是
/bin/sh
,那么这三种方法都可能被愚弄,但它实际上是重命名的bash
,例如(经常发生)。因此,关于
ps
输出是否可行的第二个问题的答案是“not always”。echo $0
- 将打印程序名称...在 shell 的情况下是实际的 shell。ps -ef | grep $$ | grep -v grep
- 这将在正在运行的进程列表中查找当前进程 ID。由于当前进程是shell,所以会被包含进来。这不是 100% 可靠,因为您可能有 其他 进程,其
ps
列表包含与 shell 进程 ID 相同的数字,特别是如果该 ID 是一个小数字(例如,如果 shell 的 PID 是“5”,您可能会在相同的grep
输出中找到名为“java5”或“perl5”的进程!)。 除了不能依赖 shell 名称之外,这是“ps”方法的第二个问题。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 上安装的sh
和ksh
之间整个环境变量集的唯一 区别是$ERRNO
、$FCEDIT
、$LINENO
、$PPID
、$PS3
、$PS4
、$RANDOM
、$SECONDS
和$TMOUT
。
关于bash - 如何确定我所在的当前交互式 shell(命令行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34774913/