这是来自的脚本Mercurial 问题 2743。叫它mq.sh
。我正在尝试让它在 Debian squeeze 上做以下事情。
将命令+标准输出+标准错误回显到文件。
带工作目录的前缀。坚持使用 $PWD 是行不通的,因为它可能只是继续使用第一次获取时的值
。最后将重定向重置回正常的标准输出/错误。我不知道该怎么做,但我想我必须
exec
再次使用。我用 来调用这个
sh mq.sh
。我想做所有可移植的事情(如果可能的话),而且 exec 似乎是 bash 特定的,所以我很困惑为什么它能起作用。也set -x xtrace
可能是 bash 特定的。我从 Bash 参考手册中得到它。 在 Debian 上调用 with 不会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()
将保存的文件描述符返回到它们的来源位置,然后关闭 ( &-
) 副本。关闭可能是不必要的,但却是个好主意。
另请注意,如果这是在其自己的 shell 中运行,则重定向会在 shell 运行时消失。如果您使用.
(portable) 或source
( bash
),则只需撤消重定向。
答案2
对于工作目录,请尝试PS4='+$PWD '
.单引号意味着它仅在即将打印时才会扩展。的第一个字符PS4
可以多次打印,因此您可能仍然需要+
或至少在开头有一个空格。
根据集合的 POSIX 定义,set -x
并且set -o xtrace
均受支持。这破折号手册页说也可以。