Shell-Script
將 stdout 和/或 stderr 重定向到變數中的路徑
如何將 stdout 和/或 stderr 重定向到我在變數中指定的路徑?**注意:**我不想覆蓋變數本身,我想製作 std
$$ xxx $$寫入變數中指定的文件。 例如 - 一個簡單的腳本,如果
scp
命令失敗,它不會將失敗消息列印到stderr
或stdout
(我不確定失敗時輸出到哪個),而是將其輸出到指定的日誌文件。日誌文件的路徑儲存在$LOG
變數中:LOG=/path/to/file.log scp file1 host@remote # do 'whatever' if scp command succeeds: if [ $? = 0 ]; then whatever else # else log both stdout/stderr to ${LOG} file &>"${LOG}" # DEBUG - print contents of ${LOG} var for testing purposes printf "${LOG}"
該腳本的結果不顯示
/path/to/file.log
文件中的任何內容,並簡單地列印/path/to/file.log
到stdout
. 所以就好像什麼都沒寫&>
。我已經確認我的特定
scp
命令有效,所以我知道這不是一個潛在的問題。或者這甚至是處理自定義日誌文件的最合適方法嗎?配置自己的日誌系統是否有比將日誌文件的路徑儲存在變數中更好的做法?
看起來您在執行命令後嘗試記錄輸出,這是不可能的。
如果您想
scp
無條件地記錄命令的輸出,那麼您只需將重定向運算符包含在與命令本身相同的行中,即:&>"${LOG}" scp file1 host@remote
如果您只想在命令失敗時保存日誌輸出(就像您在程式碼中嘗試執行的那樣),那麼如何將輸出重定向到臨時文件,然後將文件移動到所需位置?它可能看起來像這樣:
#!/bin/bash # Set path the real log file location LOG=/path/to/file.log # Create a temporary file to capture standard output and standard error TEMPLOG="$(mktemp)" # Run command and redirect output to temporary logfile 2>"${TEMPLOG}" scp file1 host@remote # do 'whatever' if scp command succeeds: if [ $? = 0 ]; then echo 'Command successful!' # else log both stdout/stderr to ${LOG} file else # Move the log file from the temporary location to the desired location mv "${TEMPLOG}" "${LOG}" # DEBUG - print contents of ${LOG} var for testing purposes printf "${LOG}" fi
看起來您最終對這個問題的結果感到滿意,但我提出了一些不同的建議。
#!/bin/bash LOG=/path/to/file.log DEBUG=0 # 0 = True, 1 = False OUTPUT=$(scp file1 host@remote 2>&1) # do 'whatever' if scp command succeeds: if [ $? -eq 0 ]; then echo "Success" elif [[ DEBUG -eq 0 ]] # else log both stdout/stderr to ${LOG} file and user # DEBUG - Use tee to display ${LOG} contents efficiently printf "$OUTPUT" | tee $LOG else # Send output to $LOG printf "$OUTPUT" >> $LOG fi
本質上無論如何都在變數中擷取 STDIN/STDOUT,然後如果成功則執行“任何操作”,但如果失敗則將 STDIN/STDOUT 重定向到
$LOG
. 此外,$DEBUG
您還可以使用標誌同時顯示tee
內容。$OUTPUT``$LOG
同樣對於整數比較,您確實應該使用
-eq
而不是=
or==