
これはのスクリプトです。物語問題2743。呼びなさいmq.sh
。私はDebianスクイーズで次のことをしようとしています。
Echo コマンド +stdout+stderr をファイルに追加します。
作業ディレクトリは接頭辞で付けられます。 $ PWDに固執することは、最初のインポート時の値を引き続き使用できるため機能しません
。最後に、リダイレクトを通常のstdout / errorにリセットします。どうすればいいかわかりませんが、
exec
もう一度使用する必要があるようです。私はこれをと呼んだ
sh mq.sh
。私は可能な限りすべてを移植可能にしたいと思い、execはbashに限定されているようで、なぜ動作するのか混乱しています。set -x xtrace
bashに固有のものかもしれません。 Bashリファレンスマニュアルから入手しました。 Debianから呼び出すと、すべてが実行されませんかsh
?dash
私は現在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
リダイレクトをキャンセルするだけです。
答え2
作業ディレクトリの場合、PS4='+$PWD '
一重引用符を使用すると、印刷しようとしたときにのみ拡張されます。の最初の文字はPS4
複数回印刷される可能性があるため、+
先頭にはまだ空白が必要であるか、少なくとも空白がある可能性があります。
~によるとコレクションのPOSIX定義、set -x
すべてset -o xtrace
サポートされます。これダッシュマンページそう言っても大丈夫です。