0

状況は次のとおりです。

私はシェルスクリプトを持っています--script.ksh

私はそれをJavaプログラムから呼び出しており、Javaプログラムのスクリプトからのstdoutが必要です。

また、出力をファイルにリダイレクトする必要があります。スクリプトがいずれかの時点で失敗した場合は、ファイルが添付されたメールを送信する必要があります。

したがって、メーラーがファイルを送信できるように、スクリプトが終了する前にファイルを閉じる必要があります。

私はすべてが正しく機能しています。

1つを除いて、スクリプトに「cd」ステートメントがある場合、スクリプトが終了する前にファイルが閉じられることはありません。ここで私を助けてください

なぜこれが起こっているのかわからない。

これがコードの簡略化されたバージョンです。

#!/bin/ksh
#Need to redirect output to file and stdout
exec 6>&1  #save stdout in [6]
exec 1>shell.log 2>&1  #redirect stderr and stdout to file


#if any error happens reset stdout and print the log contents
trap '
echo "Error Trap";
exec 1>&- 1>&6 6>&-;
echo | cat shell.log>&1;
echo "send the log file by mail";
exit 1' ERR

#cd / #Uncomment and the script behaves differently
echo "some task"
./somescript.ksh   #this requires me to cd to its directory and then execute

trap - ERR  #End the ERR trap


#in case of normal exit print the log contents
trap '

echo "Normal Exit"
exec 1>&- 1>&6 6>&-;
echo | cat shell.log>&1;
exit 1' EXIT
4

1 に答える 1

1

現在のディレクトリでファイルを開き、ディレクトリを変更しています。これらのファイルには絶対パスを使用してみてください。

なぜあなたはパイプechoを通しているのcatですか?スクリプトには影響しません。catファイルだけ。stdout を stdout にリダイレクトする必要もありません。cat fileと同じcat file >&1です。

exit 1なぜあなたは通常の出口のためにやっているのですか?私はそうあるべきですexit 0

于 2011-02-04T07:41:41.563 に答える