我正在从事从 HP-UX (B.11.23) 到 LINUX(红帽企业 Linux 服务器版本 6.5 - 圣地亚哥)的迁移项目。有几次 HP-UX 命令在 Linux 中无法正常工作。但是,在以下情况下 - 我在寻找替代解决方案时面临一些困难。
以下代码只是脚本中的示例,但要求您了解代码的最终结果。
## Assigning a text value in retval (bad path scenario)_
retval="ERROR"
if [ $retval -eq 7 ]
then
echo "I am in " $retval
fi
exit $retval
在 LINUX 中执行此代码...
LINUX $> ksh --version
version sh (AT&T Research) 93u+ 2012-08-01
LINUX $> ksh -x test12.ksh
+ retval=ERROR
+ [ ERROR -eq 7 ]
+ exit ERROR
tpl06429dat05::edwprod::/home/edwprod >echo $?
0
# look here return code of above executed script is 0_
现在,已在 HP_UX 中执行相同的代码
UNIX $> uname -a
HP-UX ipeip06 B.11.23 U ia64 ******** unlimited-user license
UNIX $> strings /bin/ksh | grep Version | tail -2
@(#)Version 11/16/88
UNIX $> ksh -x test12.ksh
+ retval=ERROR
+ [ ERROR -eq 7 ]
test12.ksh[3]: ERROR: bad number
+ exit ERROR
test12.ksh[8]: ERROR: bad number
UNIX $> echo $?
1
# Look here, return code of above executed code is 1
在Linux中,“exit”命令根本不执行,因为我传递了错误的参数(字符串),但在HP-UX中没有问题-带有错误参数的“exit”命令已被执行,并告诉我们这是一个错误的命令(echo $?) 在该脚本中。这个返回码非常重要,因为根据这个返回码($?),我们决定脚本是否执行成功(0)。
我明白,如果我们调整代码,那么问题就可以解决。但这在这里有点困难,因为我正在处理近 15K 或更多用 HP_UX 编写的此类脚本。是否有可能在操作系统级别更改某些内容(更改包/参数)。需要什么样的系统级别更改?
另一方面,ksh 版本不同且行为不同。所以,最好避免这个答案。
答案1
你的脚本结束
exit $retval
并且您设置retval
为一个字符串(其第一个单词是“ERROR:”)。
根据规范为exit
内置,
exit 实用程序应使 shell 以无符号十进制整数 n 指定的退出状态退出。如果指定了 n,但其值不在 0 到 255 之间(含 0 和 255),则退出状态未定义。
“未定义”意味着不同的实现给出不同的结果是可以的,有时甚至是预期的。
看着你的ksh
版本,HP-UX (11/16/88) 上的退出状态为 1,而 Linux 安装 (93u+) 上的退出状态为 0。如果您希望 Linux 系统的行为更像 HP -UX one,您必须安装一个以旧方式运行的不同 ksh,例如姆克什或者韓國。