0

背景:kshスクリプトをSunOS5.10からRHEL5.8 に移植する必要があります。一部のデータを取得するためにisqlを呼び出し、isqlなどの最終エンドポイントクライアントユーティリティの意図されたアプリケーションとはまったく逆に、シェルスクリプトの変数で使用されるように解析します。私はこれを継承したばかりであり、決してそのようなハックを自分で設計したわけではないことに注意してください。シェルの変数に値を割り当てるためにisqlを解析することは決してありません。スクリプトでその情報が必要な場合は、アプリケーションとデータストア間でデータをマーシャリングするように設計されたDBD::DBIなどのAPIでPerlを使用します。 。しかし、私は自分が持っているものを持っており、パラメーター内で機能する必要があります。

何が起こっているのかというと、次のパイプ入力はSunOSではデータを返しますが、RHELでは返しません。

echo "SELECT some_field FROM some_table WHERE some_crtra = 'X' \ngo" | isql -U$USER -P$PASS -D$DB -S$SERVER

Solarisでのその出力は次のとおりです。

 some_field 
 ------
 Y

(1 row affected)

その時点から、スクリプトはawk上記のストリームからフィールド値のみを抽出するために使用しますが、それは問題ではないため、無視しましょう。

また、パイプされたコマンドを個別に実行するデータを取得できることにも注意してください。つまり、手動でisqlにアクセスし、SQLを実行します。したがって、SQLや接続文字列は問題ではありません。つまり、配管がデータをストリーミングする方法か、isql自体がプラットフォームごとに異なる動作をするかです。

2つのシステムで同じ入力に対して異なる応答がある理由を誰かが理解できますか?配管を変更して機能させる方法はありますか?

ありがとう

4

1 に答える 1

2
echo "SELECT some_field FROM some_table WHERE some_crtra = 'X' \ngo"

ポータブルではありません。

代わりに提案します:

printf "SELECT some_field FROM some_table WHERE some_crtra = 'X' \ngo\n"

ksh93のマニュアルページから:

最初の引数が-で始まらず、どの引数にも\が含まれていない場合、echoは、スペースで区切られ、改行で終了する各引数を出力します。 それ以外の場合、エコーの動作はシステムに依存するため、以下で説明するprintまたはprintfを使用する必要があります。使用法と説明については、echo(1)を参照してください。

于 2012-11-23T23:36:26.930 に答える