Bash
將命令腳本寫入文件
這是來自Mercurial issue 2743的腳本。呼叫它
mq.sh
。我試圖讓它在 Debian 擠壓上做以下事情。
- 回顯命令 + 標準輸出 + 標準錯誤到文件。
- 工作目錄的前綴。堅持使用 $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
。