因此,我想將我的非互動式 zsh shell 腳本的輸出(stdout 和 stderr)記錄到 stdout 和日志檔案,并從腳本本身配置該功能。
使用 bash 腳本,我使用了以下內容并且效果很好:
#!/bin/bash
exec &> >(tee -a /path/to/logfile)
隨后的所有內容都列印到標準輸出和日志檔案。
但是當我將腳本更改為運行時#!/bin/zsh,腳本會在到達該exec行時掛起。
例如,如果腳本是這樣的:
#!/bin/zsh
echo 'test'
exec &> >(tee -a /path/to/logfile)
然后在運行它時,stdout將掛起,顯示如下:
test_script.sh:2> echo test
令人討厭的是,在掛起狀態下,Ctrl-C不會終止行程。我知道重新控制終端的唯一方法是使用Ctrl-Z將行程置于后臺,然后終止 pid。(我花了一段時間才弄清楚。)
無論如何,我想知道如何在 zsh 中獲得相同的結果。理想情況下,我也很想了解為什么 zsh 的行為與 bash 不同。
謝謝!
uj5u.com熱心網友回復:
我(終于)發現了一種與 bash 和 zsh 兼容的方法:
#!/bin/bash or #!/bin/zsh
exec > >(tee -a path/to/logfile) 2>&1
作為獎勵,我還發現了如何將日志重定向到同一腳本中的不同檔案。
#!/bin/bash or #!/bin/zsh
exec 3>&1
exec > >(tee -a path/to/logfile-1) 2>&1
echo "Copies stdout and stderr to first logfile"
exec >&3
exec > >(tee -a path/to/logfile-2) 2>&1
echo "Copies stdout and stderr to second logfile (and not the first)"
我承認我不完全理解為什么會這樣,以及為什么 exec 的行為與我之前嘗試過的不同,但我現在使用這種方法沒有任何問題。
感謝所有回復的人!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/436716.html
