これは私をパニックにさせました!
私たちは、何年も不満なく実行されてきた重要なスクリプト/プロセスをホストするSolarisシステム(バージョン:SunOS 5.8)を持っています。私たちは最近、もっと深く掘り下げて、私が知っている限り動作しないはずですが、何らかの理由で動作するテスト条件を見つけました。
$ sh
$ [ 90% -gt 95 ]; echo $?
1
$ [ 96% -gt 95 ]; echo $?
0
何? !これは偶然のようには見えません。
$ [ 96% -lt 95 ]; echo $?
1
$ [ 96% -eq 96 ]; echo $?
0
%
これは、次の2つのうちの1つではありません。
$ [ 96blah -eq 96 ]; echo $?
0
$ [ 1.2 -gt 1 ]; echo $?
1
これはSunOS 5.8、5.9、および5.10の場合であるように見えますが、これまでは見つかりませんでした。残念ながら、bashへのシンボリックリンクがないことを簡単に確認できる他の非Solarisシステムがないようです/bin/sh
(それほど解釈されません)。
もしそうであれば、粗いコード(変数を通過し、おそらく気づかないかもしれない)を除いて、x%
なぜ標準(おそらくBourne?)シェルはこれらのテストパラメータを切り取り、整数として扱うのですか?これは文書化された動作ですか?何も見えませんが、man sh
おそらく何かを逃したようです。
注:これは実際には他の奇妙なテスト条件では軽微ですが、自分で質問する価値があるかもしれません。
答え1
コメントを期待する行に合わせてフォーマットすることはできないため、回答フォームを使用してPOSIXシェルを取得する方法についてのコメントを説明しています。
POSIXシェルを取得する公式の方法は次のとおりです。
1) unset PATH # if you run an older Bourne Shell
2a) PATH=`getconf PATH` # this is with the Bourne Shell
2b) PATH=$(command -p getconf PATH) # this is with a Korn shell
3) sh # This starts a POSIX shell
標準化のためのいくつかの試みがありましたが、#!/path/to/shell
POSIXはPATHを処理しなかったため、解決策を見つけることができませんでした。
答え2
この質問に対する回答がコメントにあるようです。 Solarissh
にはいくつかの珍しい点があります。少なくとも過去には、POSIXシェルでもありません。。 (Schilyは、POSIXが/bin/sh
POSIXである必要はないことを指摘していますsh
。つまり、完全に移植可能なシェルスクリプトを作成するには別のプロセスを経なければならないという意味です。)
この質問には役に立つ情報/リンクがあるかもしれません。https://superuser.com/questions/125728/what-is-the-difference-Between-bash-and-sh
Schilyの答えは、標準が廃棄物に続く数字に何が起こるかを指定しないので、スクリプトが効果的に定義されていない動作を持ち、Solarisの動作に依存することを指摘していますsh
。したがって、携帯性はありません。
bash
これが/bin/sh
Solarisシステムでそれを使用することをお勧めしない主な理由です。一部の GNU/Linux ディストリビューションではdash
for を使用し/bin/sh
、他のディストリビューションではbash
.
私がインストールした3つのシェルでコードをテストしました。
bash 4.3-11ubuntu2
$ [ 96blah -eq 96 ]; echo $?
bash: [: 96blah: integer expression expected
2
dash 0.5.7-4ubuntu1
$ [ 96blah -eq 96 ]; echo $?
dash: 1: [: Illegal number: 96blah
2
busybox sh 1.22.0-9ubuntu1
$ [ 96blah -eq 96 ]; echo $?
sh: 96blah: bad number
2
答え3
標準はテスト演算子がオペランドを-gt
整数として比較することを好むと述べていますが、提供された文字列が整数でないときに何が起こるかについては何も言及しません。したがって、観察された動作は完全に正確です。注:歴史的なUNIXの動作とも互換性があります。
/bin/shはもちろんbashには接続されません。なぜなら、bashは標準に準拠せず、多くのスクリプトが失敗する可能性があるからです。
2010年にSolaris 10が開発され、/bin/shはksh93に置き換えられました。 kshはbashよりもBourne Shellと互換性がありますが、これにより、以前はSolarisが他のファイルシステムで/および/ usrを持つことができなくなりました。 ksh93は/ usrから動的ライブラリをロードします。