デプロイメントに使用するシェルスクリプトがあります。プロセス全体の出力をキャプチャしたいので、それをサブシェルでラップし、それをテールアウトしました。
#! /usr/bin/env ksh
# deploy.sh
########################################################################
(yadda, yadda, yadda)
########################################################################
# LOGGING WRAPPER
#
dateFormat=$(date +"%Y.%m.%d-%H.%M.%S")
(
print -n "EXECUING: $0 $*: "
date
#
########################################################################
(yadda, yadda, yadda)
#
# Tail Startup
#
trap 'printf "Stopping Script: ";date;exit 0"' INT
print "TAILING LOG: YOU MAY STOP THIS WITH A CTRL-C WHEN YOU SEE THAT SERVER HAS STARTED"
sleep 2
./tailLog.sh
) 2>&1 | tee "deployment.$dateFormat.log"
#
########################################################################
サブシェルを使用する前は、trap
コマンドは機能していました。を押すCNTL-C
と、プログラムと日付が印刷さStopping Script:
れます。
ただし、このスクリプトの出力を忘れないようにしたかったので、サブシェルを使用して出力を自動的に保存しました。そして、今trap
は機能していないようです。
私は何が間違っているのですか?
新情報
もう少し遊んでください。問題はシェルでもサブシェルでもないことがわかりました。いまいましいパイプです!
tee
出力をにパイプしない場合は、正常にtrap
機能します。出力をにパイプするとtee
、はtrap
機能しません。
それで、本当の問題は、どのように出力をティーし、それでも使用できるtrap
かということです。
テストプログラム
答える前に、次のテストプログラムを試してください。
#! /bin/ksh
dateFormat=$(date +"%Y.%m.%d-%H:%M:%S")
(
trap 'printf "The script was killed at: %s\n", "$(date)"' SIGINT
echo "$0 $*"
while sleep 2
do
print -n "The time is now "
date
done
) | tee somefile
と
#! /bin/ksh
dateFormat=$(date +"%Y.%m.%d-%H:%M:%S")
(
trap 'printf "The script was killed at: %s\n", "$(date)"' SIGINT
echo "$0 $*"
while sleep 2
do
print -n "The time is now "
date
done
)
上の1つはにパイプしsomefile....
ます。一番下のものはそうではありません。一番下のトラップは機能します。一番上のもの、トラップはしません。パイプを機能させ、「スクリプトが強制終了されました」という行を使用して、ティードアウトファイルに出力できるかどうかを確認します。
パイプは機能します。トラップはありませんが、私がパイプを持っているときだけです。ステートメントをあちこちに移動して、trap
サブシェルのレイヤーとレイヤーに配置できます。私がやっていることは間違っていることがいくつかあり、それが何であるかわかりません。