脚本如何知道哪个shell正在执行它

时间:2016-06-13 17:29:03

标签: shell sh

我想知道给定的脚本是否在Ash,Dash,Bash,ZSH或其他东西下运行。

该脚本可能有也可能没有shebang行,可以直接执行(sh my-script.sh),也可以作为shell解释器(show_shell() { basename "$(readlink -f /proc/$$/exe)" ;} )的参数执行。

找出它的最直接的方法是什么?

编辑:在阅读下面的答案和重复的问题之后,我发现这是找到在Linux下执行脚本的shell名称的最简单可靠的方法:

companion object {
    private val map = Type.values().associateBy(Type::value)
    fun fromInt(type: Int) = map[type]
}

1 个答案:

答案 0 :(得分:1)

没有通用的标准方法来获取当前shell标识的名称。

Prouder shell留下您可以检查的标记:

[ "$BASH_VERSION" ] && echo bash
[ "$ZSH_VERSION" ] && echo zsh
[ "$KSH_VERSION" ] && echo ksh

ashdash等更为简陋的贝壳,不会。

如果这一点是运行特定于shell的代码,这可能不是问题,因为ashdash不包括POSIX之外的许多功能。

如果(并且仅当)您使用的是Linux,则可以从/proc/$$/exe收集一些见解:

$ dash -c 'ls -l /proc/$$/exe'
lrwxrwxrwx 1 me me 0 Jun 13 11:46 /proc/10933/exe -> /bin/dash

然而,对于sh,它只会说/bin/sh,无论哪个shell实际实现它,但/bin/sh可能是也可能不是符号链接或更可识别二进制文件的硬链接。