shが何であるかを調べる[重複]

shが何であるかを調べる[重複]

移植性が必要なスクリプトセットを作成していますが、sh現在のプラットフォームでこのスクリプトがを表すかどうかを示すかどうかbashksh知る必要がありますash。これを行う明確な方法はありますか?

私の最初の考えは、どのシェルに何があるかを確認することでした--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/...現在作業中のシェルを変数に割り当て、その変数をどこでも使用する同様のプロジェクトです。

全体的な作業のきちんとするには問題を修正する必要があるため、コードを公開できません。また、これは猿のコードが多すぎるでしょう。誤解しないでください。しかし、POSIXの互換性が狭すぎるため、プロジェクトを十分に小さくすることはできません。それ以外の場合は、システム構成に依存する必要があります。

ただし、UNIX シェル定義関数を公開することはできます。

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
}

PS。最小限の研究では、シェルをサブプロセスとして実行しても$ SHELLが変更されないことがわかりました。

ベストアンサー1

人気のディストリビューション:

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

またはより簡潔に:

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

ただし、一部(特に組み込みシステムまたはinitrdビルド)には、/ bin / shに直接コンパイルされたシェルがあるか、ハードリンクされています(busybox)。

別の珍しい例はWindowsです。この場合、git bash:

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

おすすめ記事