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

脚本如何知道哪个shell正在执行它,shell,sh,Shell,Sh,我想知道给定的脚本是否在Ash、Dash、Bash、ZSH或其他模式下运行 脚本可能有也可能没有shebang行,它可以直接执行(my script.sh),也可以作为shell解释器的参数执行(sh my script.sh) 最直接的方法是什么 编辑:在阅读了下面的答案和重复的问题后,我发现这是查找在Linux下执行脚本的shell名称的最简单、最可靠的方法: show_shell() { basename "$(readlink -f /proc/$$/exe)" ;} 没有通用的、标准

我想知道给定的脚本是否在Ash、Dash、Bash、ZSH或其他模式下运行

脚本可能有也可能没有shebang行,它可以直接执行(
my script.sh
),也可以作为shell解释器的参数执行(
sh my script.sh

最直接的方法是什么

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

show_shell() { basename "$(readlink -f /proc/$$/exe)" ;}

没有通用的、标准的方法来获取当前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
可能是也可能不是指向更易识别的二进制文件的符号链接或硬链接。

如何调用此脚本?脚本是否有一行“#!”?编辑以澄清这一点。有关使用
$
的示例可能重复适用于Dash,但对于Bash和ZSH,内部命令的路径(
ls
)打印:
bash-c'ls-l/proc/$$/exe'
/proc/3576/exe->/bin/ls
@Elifarley这是一个很好的观点。这是因为bash/zsh在只有一个命令要执行的情况下很聪明。如果您将其作为脚本的一部分使用(或添加一个伪
;true
),它将正确显示。因此,我要声明这样一个函数:
show_shell(){readlink-f/proc/$$/exe;}
旁白:另一个要检查的重要函数是fish,它在这个分类法中是“骄傲的”。
shell[“$fish\u VERSION]”和&echo fish`