Bash

將命令腳本寫入文件

  • May 6, 2011

這是來自Mercurial issue 2743的腳本。呼叫它mq.sh。我試圖讓它在 Debian 擠壓上做以下事情。

  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

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

引用自:https://unix.stackexchange.com/questions/12774