当前位置: 首页 > 面试题库 >

如何克服Linux上的ksh与AIX / Solaris / HPUX上安装的ksh之间的不兼容?

南门星河
2023-03-14
问题内容

我参与了将包含数百个ksh脚本的系统从AIX,Solaris和HPUX移植到Linux的过程。我在ksh在两个系统上的行为方式上遇到了以下差异:

#!/bin/ksh
flag=false
echo "a\nb" | while read x
do
    flag=true
done
echo "flag = ${flag}"
exit 0

在AIX,Solaris和HPUX上,输出为“ flag = true”;在Linux上,输出为“ flag = false”。

我的问题是:

  • 我是否可以设置一个环境变量来使Linux的ksh像其他Os一样运行?失败:
  • Linux的ksh上是否有一种选项可以获取所需的行为?失败:
  • 是否有可用于Linux且具有所需行为的ksh实现?

其他说明:

  • 在AIX,Solaris和HPUX上,ksh是ksh88的变体。
  • 在Linux上,ksh是公共域ksh(pdksh)
  • 在AIX上,Solaris和HPUX dtksh和ksh93(在其中安装了它们)与ksh一致
  • 我可以访问的Windows NT系统:Cygwin和MKS NT与Linux一致。
  • 在AIX,Solaris和Linux上,bash一致,给出错误的结果(从我看来)“ flag = false”。

下表总结了系统存在的问题:

uname -s       uname -r                   which ksh          ksh version                     flag =
========       ========                   =========          ===========                     ======
Linux          2.6.9-55.0.0.0.2.ELsmp     /bin/ksh           PD KSH v5.2.14 99/07/13.2       false
AIX            3                          /bin/ksh           Version M-11/16/88f             true    // AIX 5.3
                                          /bin/ksh93         Version M-12/28/93e             true
SunOS          5.8, 5.9 and 5.10          /bin/ksh           Version M-11/16/88i             true
                                          /usr/dt/bin/dtksh  Version M-12/28/93d             true
HP-UX          B.11.11 and B.11.23        /bin/ksh           Version 11/16/88                true
                                          /usr/dt/bin/dtksh  Version M-12/28/93d             true
CYGWIN_NT-5.1  1.5.25(0.156/4/2)          /bin/ksh           PD KSH v5.2.14 99/07/13.2       false
Windows_NT     5                          .../mksnt/ksh.exe  Version 8.7.0 build 1859...     false    // MKS

在我公司的一些人员提出建议之后,我们决定对代码进行以下修改。无论使用“真实” ksh(ksh88,ksh93)还是任何ksh克隆(pdksh,MSK
ksh),这都给我们相同的结果。这对于bash也可以正常使用。

#!/bin/ksh
echo "a\nb" > junk
flag=false
while read x
do
    flag=true
done < junk
echo "flag = ${flag}"
exit 0

感谢jj33先前接受的答案。


问题答案:

在我公司的一些人员提出建议之后,我们决定对代码进行以下修改。无论使用“真实” ksh(ksh88,ksh93)还是任何ksh克隆(pdksh,MSK
ksh),这都给我们相同的结果。这对于bash也可以正常使用。

#!/bin/ksh
echo "a\nb" > junk
flag=false
while read x
do
    flag=true
done < junk
echo "flag = ${flag}"
exit 0

感谢jj33为先前接受的答案。



 类似资料:
  • 问题内容: 我一直认为,子shell程序不是子进程,而是同一进程中的另一个shell程序环境。 我使用一组基本的内置函数: 在另一个终端上: 因此,kornShell(ksh)中没有子进程。 输入bash,使用相同的命令,其行为似乎有所不同: 因此,bash中的一个子进程。 通过阅读bash手册页,很明显,为子shell创建了另一个进程,但是它伪造了$$,这很时髦。 是bash和ksh之间的区别是

  • 既然要学习 Go 语言,那么肯定要在本机安装 Go 语言的开发环境,上节课我们学习了如何在 Windows 操作系统上安装 Go 语言开发环境,这节课我们来学习下如何在 Linux 操作系统上安装 Go 语言开发环境: 1. Go 语言的下载 Tips:本文以本文撰写时的 Go 语言最新版本,也就是 go.1.13.5 版本为例。 Linux 发行版本使用 Ubuntu18.04 为例来做演示。

  • 问题内容: 我 以非特权用户身份 在linux和Solaris上运行此小型python脚本: 在运行之前,将setuid位设置在脚本上(而不是在python解释器上): 在Solaris上,由于setuid位设置了有效的uid: 但不是在Linux上: 请注意,Solaris和Linux的python版本均为2.6 是否可以将Python Linux用作Python Solaris? 问题答案:

  • 问题内容: 我正在尝试在Amazon Linux实例上安装OpenCV与Pastec一起使用。这是我第一次使用Amazon服务,而且我对Linux的使用经验不足。 我将如何安装OpenCV及其对Amazon Linux的依赖关系? 我尝试使用以下命令添加EPEL存储库: …可以,但是仍然无法安装OpenCV … 问题答案: 似乎 Amazon AMI的* 默认存储库不包含 OpenCV 软件包。

  • 问题内容: 注意:最初发布时,我正在尝试安装maven2。由于主要答案是针对maven3的,因此我更新了标题。问题的其余部分仍然保持原来的状态。 我正在尝试使用以下命令在Redhat Linux框上安装Maven2 但是,yum似乎无法找到maven2。 我遇到过有关该主题的其他帖子,但是对以下帖子的回答建议添加存储库。我添加了所述存储库,但是在添加它们后遇到了错误。 我只能通过命令行访问此框,因

  • 问题内容: 我看过有关使用yum安装依赖项,然后从源代码安装Node.JS和NPM的文章。虽然这样做确实可行,但我觉得Node.JS和NPM都应该放在某个公共仓库中。 如何在AWS Amazon Linux上的一个命令中安装Node.JS和NPM? 问题答案: 迷迷糊糊地发现,后来很难再次找到。后代放在这里: 编辑3: 自2016年7月起, 编辑1 不再适用于nodejs 4(和 编辑2 都不适用