Ale*_*exC 5 shell solaris test
这一招让我措手不及!
我们有一台 Solaris 机器(版本:SunOS 5.8)托管一个关键的脚本/进程,它已经运行了很多年而没有抱怨。我们最近有理由深入了解并发现一个测试条件——据我所知——不应该工作,但由于某种原因:
$ sh
$ [ 90% -gt 95 ]; echo $?
1
$ [ 96% -gt 95 ]; echo $?
0
Run Code Online (Sandbox Code Playgroud)
什么?!这似乎不是侥幸:
$ [ 96% -lt 95 ]; echo $?
1
$ [ 96% -eq 96 ]; echo $?
0
Run Code Online (Sandbox Code Playgroud)
这不仅仅是%:
$ [ 96blah -eq 96 ]; echo $?
0
$ [ 1.2 -gt 1 ]; echo $?
1
Run Code Online (Sandbox Code Playgroud)
在 SunOS 5.8、5.9 和 5.10 上似乎是这样,但我之前没有注意到这一点。不幸的是,我手头似乎没有另一个非 Solaris 系统可以轻松检查它没有/bin/sh与 bash 的符号链接(它的解释不是那么自由)。
所以,除了草率的代码(它x%是由变量传递的,可能没有注意到),为什么标准(大概是 Bourne?)shell 通过截断它们来将这些测试参数视为整数?这是记录在案的行为吗?我看不到任何东西,man sh但可能错过了一些东西。
注意:这实际上是另一个奇怪测试条件下的次要嘘声,但这可能值得自己提出问题。
该标准规定测试运算符喜欢-gt将其操作数作为整数进行比较,但它没有提到当提供的字符串不是整数时会发生什么。所以观察到的行为是完全正确的。顺便说一句:它也与历史 UNIX 行为兼容。
/bin/sh 当然没有链接到 bash,因为 bash 不够符合标准,可能会导致很多脚本失败。
2010 年,随着 Solaris 10 的发展,/bin/sh 被 ksh93 取代,尽管 ksh 比 bash 更兼容 Bourne Shell,但这导致 Solaris 无法在不同的文件系统中拥有 / 和 /usr之前没有问题。请注意,ksh93 从 /usr 加载动态库。