如何确定我正在使用的当前 shell?
仅命令的输出ps就足够了吗?
ps
如何在不同风格的 Unix 中做到这一点?
请注意,如果 shell 的可执行文件是 ,则所有三种方法都可能被愚弄/bin/sh,但它实际上是重命名的bash,例如(经常发生)。
/bin/sh
bash
因此,您的第二个关于输出是否可行的问题是用“ 不总是*ps”来回答的。 *
1. `echo $0`\- 将打印程序名称......在外壳的情况下是实际的外壳。 2. `ps -ef | grep $$ | grep -v grep`\- 这将在正在运行的进程列表中查找当前进程 ID。由于当前进程是shell,所以会包含在内。
这不是 100% 可靠的,因为您可能有 其他 进程的ps列表包含与 shell 的进程 ID 相同的数字,特别是如果该 ID 是一个小数字(例如,如果 shell 的 PID 为“5”,您可能会发现进程称为“java5”或“perl5”在同一grep输出!)。 这是“ps”方法的第二个问题,除了不能依赖 shell 名称之外。
grep
3. `echo $SHELL`\- 当前 shell 的路径存储`SHELL`为任何 shell 的变量。对此的警告是,如果您将 shell 显式启动为子进程(例如,它不是您的登录 shell),您将获得登录 shell 的值。如果有可能,请使用`ps`or`$0`方法。
但是,如果可执行文件与您的实际 shell 不匹配(例如/bin/sh实际上是 bash 或 ksh),您需要启发式方法。下面是一些特定于各种 shell 的环境变量:
$version在 tcsh 上设置
$version
$BASH设置在 bash
$BASH
$shell(小写)设置为 csh 或 tcsh 中的实际 shell 名称
$shell
$ZSH_NAME在 zsh 上设置
$ZSH_NAME
ksh 有$PS3和$PS4设置,而普通的 Bourne shell ( sh) 只有$PS1和$PS2设置。这通常似乎是最难区分的——我们在 Solaris boxen 上安装的整个环境变量集的 唯一 区别是, , , , , , ,和。sh``ksh``$ERRNO``$FCEDIT``$LINENO``$PPID``$PS3``$PS4``$RANDOM``$SECONDS``$TMOUT
$PS3
$PS4
sh
$PS1
$PS2
sh``ksh``$ERRNO``$FCEDIT``$LINENO``$PPID``$PS3``$PS4``$RANDOM``$SECONDS``$TMOUT