找出 sh 是什么

找出 sh 是什么

我正在编写一组想要可移植的脚本,但我需要知道sh在当前平台上是否代表bashkshash。有明确的方法吗?

我首先想到的是检查哪个 shell 有哪个--version

$ zsh --version
zsh 5.0.2 (x86_64-apple-darwin13.0)

$ bash --version
GNU bash, version 4.3.39(1)-release (x86_64-apple-darwin13.4.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ ksh --version
  version         sh (AT&T Research) 93u+ 2012-08-01

$ dash --version
dash: 0: Illegal option --

$ pdksh --version
pdksh: pdksh: --: unknown option

除了笨拙之外,这甚至不能在所有情况下产生结果。

编辑

我需要它为我的bashrc/zshrc/... 类似的项目,我将当前的工作 shell 分配给一个变量,并在任何地方使用该变量。

我无法发布我的代码,因为我需要解决问题以实现工作的整体整洁。而且,这会是太多的monkeycode...不要误解它,但是POSIX兼容性太窄,无法使我的项目足够小。否则我需要依靠系统配置。

不过,我可以发布我的 UNIX Shell 定义函数:

PROJ_GET_SHELL () {
    local PROJ_SHELL="`ps -p $$ | tail -1 | tr ' ' '\n' | tail -1`"
    PROJ_local=(pdksh bash dash mksh zsh ksh sh)
    for i in ${PROJ_local[*]}
    do
        if ! [ -z `echo $PROJ_SHELL | grep $i` ]
        then
            echo "$i"
            break
        fi
    done
}

附言。最少的研究表明,当将 shell 作为子进程运行时,$SHELL 不会改变。

答案1

在流行的发行版上:

$ which sh
/bin/sh
$ readlink -f /bin/sh
/bin/dash

或者更紧凑:

$ readlink -f $(which sh)
/bin/dash

然而,有些(特别是嵌入式系统或 initrd 构建)的 shell 直接编译为 /bin/sh 或者它是硬链接(busybox)

另一个不寻常的例子是Windows。 git bash 在这种情况下:

$ readlink -f $(which sh)
/usr/bin/sh

相关内容