移植性が必要なスクリプトセットを作成していますが、sh
現在のプラットフォームでこのスクリプトがを表すかどうかを示すかどうかbash
をksh
知る必要があります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