如何确定我正在使用的当前shell ?
仅仅ps命令的输出就足够了吗?
如何在不同风格的Unix中实现这一点?
如何确定我正在使用的当前shell ?
仅仅ps命令的输出就足够了吗?
如何在不同风格的Unix中实现这一点?
当前回答
如果你只是想确保用户正在使用Bash调用脚本:
if [ -z "$BASH" ]; then echo "Please run this script $0 with bash"; exit; fi
或参考
if [ -z "$BASH" ]; then exec bash $0 ; exit; fi
其他回答
我尝试过许多不同的方法,对我来说最好的方法是:
ps -p $$
它也可以在Cygwin下工作,并且不能像PID grepping那样产生假阳性。经过一些清理,它只输出一个可执行名称(在Cygwin With path下):
ps -p $$ | tail -1 | awk '{print $NF}'
你可以创建一个函数,这样你就不必记住它:
# Print currently active shell
shell () {
ps -p $$ | tail -1 | awk '{print $NF}'
}
…然后执行shell。
它在Debian和Cygwin下进行了测试。
这个在Red Hat Linux (RHEL), macOS, BSD和一些aix上运行良好:
ps -T $$ | awk 'NR==2{print $NF}'
或者,如果pstree可用,下面的一个也应该工作,
pstree | egrep $$ | awk 'NR==2{print $NF}'
这不是一个非常干净的解决方案,但它是你想要的。
# MUST BE SOURCED..
getshell() {
local shell="`ps -p $$ | tail -1 | awk '{print $4}'`"
shells_array=(
# It is important that the shells are listed in descending order of their name length.
pdksh
bash dash mksh
zsh ksh
sh
)
local suited=false
for i in ${shells_array[*]}; do
if ! [ -z `printf $shell | grep $i` ] && ! $suited; then
shell=$i
suited=true
fi
done
echo $shell
}
getshell
现在您可以使用$(getshell)——version。
不过,这只适用于kornshell类shell (ksh)。
不需要从"ps"的输出中Grepping PID,因为你可以从/proc目录结构中读取任何PID的相应命令行:
echo $(cat /proc/$$/cmdline)
然而,这可能并不比简单地:
echo $0
关于运行一个与名称不同的shell,一个想法是使用之前获得的名称从shell请求版本:
<some_shell> --version
sh似乎失败的退出码2,而其他人给出一些有用的(但我无法验证所有,因为我没有他们):
$ sh --version
sh: 0: Illegal option --
echo $?
2
我想到了这个:
sed 's/.*SHELL=//; s/[[:upper:]].*//' /proc/$$/environ