小编典典

如何确定我正在处理的当前 shell

all

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

仅命令的输出ps就足够了吗?

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


阅读 99

收藏
2022-03-03

共1个答案

小编典典

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

请注意,如果 shell 的可执行文件是 ,则所有三种方法都可能被愚弄/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 名称之外。

3. `echo $SHELL`\- 当前 shell 的路径存储`SHELL`为任何 shell 的变量。对此的警告是,如果您将 shell 显式启动为子进程(例如,它不是您的登录 shell),您将获得登录 shell 的值。如果有可能,请使用`ps`or`$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

2022-03-03