Shell-Script

將 stdout 和/或 stderr 重定向到變數中的路徑

  • April 6, 2018

如何將 stdout 和/或 stderr 重定向到我在變數中指定的路徑?**注意:**我不想覆蓋變數本身,我想製作 std

$$ xxx $$寫入變數中指定的文件。 例如 - 一個簡單的腳本,如果scp命令失敗,它不會將失敗消息列印到stderrstdout(我不確定失敗時輸出到哪個),而是將其輸出到指定的日誌文件。日誌文件的路徑儲存在$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.logstdout. 所以就好像什麼都沒寫&>

我已經確認我的特定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==

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