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

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

如何在不同风格的Unix中实现这一点?


当前回答

Ps -p $$

应该在涉及ps -ef和grep的解决方案的任何地方工作(在任何支持POSIX选项的ps的Unix变体上),并且不会受到grepping对可能出现在其他地方的数字序列引入的误报的影响。

其他回答

这不是一个非常干净的解决方案,但它是你想要的。

# 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

我对打印父进程的变体:

ps -p $$ | awk '$1 == PP {print $4}' PP=$$

当AWK可以为您运行不必要的应用程序时,不要运行它。

你可以试试:

ps | grep `echo $$` | awk '{ print $4 }'

Or:

echo $SHELL

Ps是最可靠的方法。SHELL环境变量不能保证被设置,即使设置了,也很容易被欺骗。