コマンドレコードをファイルに書き込む

コマンドレコードをファイルに書き込む

これはのスクリプトです。物語問題2743。呼びなさいmq.sh。私はDebianスクイーズで次のことをしようとしています。

  1. Echo コマンド +stdout+stderr をファイルに追加します。

  2. 作業ディレクトリは接頭辞で付けられます。 $ PWDに固執することは、最初のインポート時の値を引き続き使用できるため機能しません

  3. 最後に、リダイレクトを通常のstdout / errorにリセットします。どうすればいいかわかりませんが、exec もう一度使用する必要があるようです。

  4. 私はこれをと呼んだsh mq.sh。私は可能な限りすべてを移植可能にしたいと思い、execはbashに限定されているようで、なぜ動作するのか混乱しています。set -x xtracebashに固有のものかもしれません。 Bashリファレンスマニュアルから入手しました。 Debianから呼び出すと、すべてが実行されませんかshdash

私は現在1が動作すると思います。 2と3はどうしますか? 4を明確にできますか?

export PS4="$PWD$ "
exec > mq.log 2>&1
export HG="hg-crew"
rm -r main clone

set -o xtrace
$HG init main
cd main
$HG init --mq
$HG qnew foo
echo a > a
$HG add
$HG qref
$HG ci --mq -Am.
cd ..
$HG qclone main clone
cd clone
$HG paths --mq
mv .hg/patches/.hg/hgrc{,.foo}
$HG paths --mq
$HG push --mq
echo b >> a
$HG qref
$HG ci --mq -m.
mv .hg/patches/.hg/hgrc.foo .hg/patches/.hg/hgrc
$HG push --mq

ベストアンサー1

execファイル記述子の場合はset -x移植可能ですxtraceが、実際には同じでなければなりません-x

ファイル記述子を保存して復元するには、実際に再exec利用する必要があります。未使用のディスクリプタをいくつか選択し(通常はディスクリプタが2つ以上あることを意味します)、元のディスクリプタをこれらのディスクリプタにリダイレクトし、最後にリダイレクトする必要があります。

exec 20<&0 21>&1 22>&2
# do your redirections
# do whatever you wanted to have redirected
exec <&20 >&21 2>&22 20<&- 21>&- 22>&-

最後の行は、最初にdup()保存されたファイル記述子をソースの場所に返し、&-コピーを閉じます()。閉じるのは不要かもしれませんが、良い考えです。

また、これが独自のシェルで実行されている場合、シェルの実行中にリダイレクトが消えます。.(ポータブル)またはsource()を使用している場合は、bashリダイレクトをキャンセルするだけです。

おすすめ記事