2

数百の ksh スクリプトを AIX、Solaris、および HPUX から Linux に移植する作業の中で、別の問題を発見しました。前回の問題はこちら

このコード:

#!/bin/ksh
if [ -a k* ]; then
    echo "Oh yeah!"
else
    echo "No way!"
fi
exit 0

(名前が k で始まる複数のファイルを含むディレクトリで実行すると)、「そうそう!」が生成されます。AT&T ksh バリアント (ksh88 および ksh93) で呼び出された場合。一方、「No way!」というエラー メッセージが表示されます。他の ksh バリアント (pdksh、MKS ksh、および bash)。

繰り返しますが、私の質問は次のとおりです。

  • pdksh を ksh93 のように動作させる環境変数はありますか? 失敗した場合:
  • 必要な動作を取得するための pdksh のオプションはありますか?
4

4 に答える 4

5

Linuxでpdkshを使用することはもうありません。AT&T ksh がオープンソースになったため、さまざまな Linux ディストリビューションからパッケージを入手できます。たとえば、RedHat Enterprise Linux と CentOS には、「ksh」RPM パッケージとして ksh93 が含まれています。

pdksh は、ソフトウェア ベンダーからの多くのインストール要件ドキュメントで今でも言及されています。すべての Linux システムの pdksh を ksh93 に置き換えましたが、これまでのところ問題はありません。

于 2008-12-23T16:19:17.083 に答える
0

1年経っても、私の問題に対する解決策はないようです。

私はそれと一緒に暮らさなければならないと言うためにこの答えを追加しています......

于 2009-09-17T14:49:42.577 に答える
0

[ は のエイリアス (多くの場合、シンボリックまたはハード リンク) であることを認識しています/usr/bin/testよね? おそらく実際の問題は、異なるバージョンの/usr/bin/test?

OTOH、kshは組み込みでオーバーライドします。そうならないようにする方法はあるのでしょうか?または、すべてのプラットフォームで互換性がある/usr/bin/test場合は、明示的に [ を にエイリアスできますか?/usr/bin/test

于 2008-09-18T20:55:17.070 に答える
0

Bash では、 test -a 操作は単一のファイルに対するものです。

Ksh88 では、test -a 操作は単一のファイルに対するものであると推測していますが、他のテスト ワードは -a に対する未指定の条件であるため、問題はありません。

あなたは次のようなものが欲しい

for K in /etc/rc2.d/K* ; do test -a $K && echo heck-yea ; done

この点で、ksh93 は bash と同じように機能すると言えます。残念なことに、私の意見では、コードの書き方がまずかったと思います。問題の根本的な原因は、ずさんなコードを可能にする ksh88 組み込みテストであるため、悪い意見である可能性があります。

于 2010-04-26T06:58:58.763 に答える