私は、数百のkshスクリプトを含むシステムをAIX、Solaris、およびHPUXからLinuxに移植するプロセスに携わっています。2つのシステムでの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およびHPUXkshはksh88のバリアントです。
- Linuxでは、kshはパブリックドメインksh(pdksh)です。
- AIXでは、SolarisとHPUXのdtkshとksh93(インストールしている場所)はkshと整合性があります
- 私がアクセスできるWindowsNTシステム: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に感謝します。