我想知道给定的脚本是否在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]
}
答案 0 :(得分:1)
没有通用的标准方法来获取当前shell标识的名称。
Prouder shell留下您可以检查的标记:
[ "$BASH_VERSION" ] && echo bash
[ "$ZSH_VERSION" ] && echo zsh
[ "$KSH_VERSION" ] && echo ksh
ash
和dash
等更为简陋的贝壳,不会。
如果这一点是运行特定于shell的代码,这可能不是问题,因为ash
和dash
不包括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
可能是也可能不是符号链接或更可识别二进制文件的硬链接。