3

エラー出力を取得して ksh の変数またはファイルに保存する方法を理解するのに少し苦労しています。私のスクリプトでは、ループcp -p source.file destination内にあります。while

以下のエラーが発生した場合

cp: source.file: The file access permissions do not allow the specified action.

それをつかんで、変数またはファイルに保存したい。

ありがとう

4

3 に答える 3

4

次のように、コマンドのエラー出力をリダイレクトできます。

cp -p source.file destination 2>> my_log.txt

my_log.txtファイルにエラーメッセージを追加します。

変数が必要な場合は、stderrをstdoutにリダイレクトし、コマンド出力を変数に割り当てることができます。

my_error_var=$(cp -p source.file destination 2>&1)
于 2012-06-07T18:50:35.363 に答える
1

ksh (Q による) では、bash やその他の sh 派生物と同様に、リダイレクトを使用して cp からすべて/標準エラー出力のみを取得し、var を取得できます (漠然と最近のバージョンを使用している場合は、バックティックよりも $() を使用します)。 :

output=$(cp -p source.file destination 2>&1)

cp は通常何も出力しませんが、これは stdout と stderr をキャプチャします。この方法で stderr だけをキャプチャするには、1>/dev/nullも使用します。ファイルにリダイレクトする他のソリューションでは、cat/さまざまな他のコマンドを使用してログファイルを出力/処理できます。

一時ファイルへの出力の使用をお勧めしない理由:

ファイルにリダイレクトしてから、( read コマンドを介して、またはより非効率的に を介して$(cat file)) それを読み取ることは、特に 1 行だけの場合、効率が悪く遅くなります。エラーを表示する前に複数の操作のたびに追加したい場合はそれほど悪くはありません。また、常にクリアしない限り、一時ファイルをそのままにしておきます。人々が中断したとき(つまり、Ctrl-C)、またはスクリプトを強制終了したことを忘れないでください。

スクリプトが一度に複数回実行される場合、一時ファイルの使用も問題になる可能性があります (たとえば、ファイルシステム/その他の遅延によって大量のオーバーランが発生した場合、または単に複数のユーザーからの場合、cron を介して発生する可能性があります)。ただし、一時ファイル名が一意である場合を除きます。

一時ファイルの生成は、非常に慎重に行わない限り、セキュリティ リスクでもあります。特に、ファイル データが再度処理されたり、ユーザーを混乱させたり、フィッシングしたり、スクリプトを壊したりするために、他の何かによって表示される前に内容が書き換えられる可能性がある場合は特に注意が必要です。何気なく行う習慣にならないでください。最初に一時ファイル (例: mktemp) を他の質問 (ここ/google) で調べてください。

于 2012-06-07T18:53:03.913 に答える
0

次のようにして、STDERR リダイレクトを行うことができます。

command 2> /path/to/file.txt
于 2012-06-07T18:48:40.517 に答える