将命令记录写入文件

将命令记录写入文件

这是来自的脚本Mercurial 问题 2743。叫它mq.sh。我正在尝试让它在 Debian squeeze 上做以下事情。

  1. 将命令+标准输出+标准错误回显到文件。

  2. 带工作目录的前缀。坚持使用 $PWD 是行不通的,因为它可能只是继续使用第一次获取时的值

  3. 最后将重定向重置回正常的标准输出/错误。我不知道该怎么做,但我想我必须exec 再次使用。

  4. 我用 来调用这个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均受支持。这破折号手册页说也可以。

相关内容