命令:
sh run.sh 2>&1 | tee output.log
sh run.sh 2>&1 | tee output_$(date "+%Y%m%d%H%M").log
作用:運行腳本,并同時將輸出(包括標準輸出和錯誤輸出)顯示到終端,并保存到文件中。
2>&1:把標準錯誤重定向到標準輸出。
管道符|:將前面的結果傳遞給tee命令。
tee:把輸出同時顯示到終端和寫入文件中。
AI查詢:
命令 sh run.sh 2>&1 | tee output.log 的作用是運行 shell 腳本 run.sh,并同時將輸出(包括標準輸出和錯誤輸出)顯示到終端,并保存到 output.log 文件中。下面我會逐一解釋每個部分的作用和邏輯:----------------------------------------1. SH RUN.SH· sh:調用系統默認的 shell 解釋器(通常為 Bourne Shell)。· run.sh:要執行的 shell 腳本文件。· 整體作用:執行 run.sh 腳本。----------------------------------------2. 2>&1(文件描述符重定向)· 文件描述符(File Descriptors) 是 Unix/Linux 系統中對輸入/輸出流的抽象編號:· 0:標準輸入(Standard Input)· 1:標準輸出(Standard Output,通常是終端輸出)· 2:標準錯誤(Standard Error,通常是錯誤信息輸出)· 2>&1 的含義:· 將 文件描述符 2(標準錯誤) 重定向到 文件描述符 1(標準輸出)。· 即:將錯誤信息與正常輸出合并,一起輸出到同一個位置。----------------------------------------3. | TEE OUTPUT.LOG· |:管道符,將左邊命令的輸出傳遞給右邊的命令。· tee:這是一個工具,用于將輸入同時顯示到終端和寫入文件。· output.log:要保存輸出的文件。· 整體作用:· 將 sh run.sh 的輸出(包括錯誤信息)通過 tee 工具同時顯示到終端和寫入 output.log 文件。----------------------------------------4. 完整邏輯鏈條結合以上部分,命令的執行流程如下:1. 執行 run.sh 腳本,生成 標準輸出(stdout) 和 標準錯誤(stderr)。2. 將 stderr(描述符 2) 重定向到與 stdout(描述符 1) 相同的位置(2>&1)。3. 將合并后的所有輸出通過管道符 | 傳遞給 tee output.log。4. tee 將這些輸出 實時顯示在終端,并 同步寫入 output.log 文件。----------------------------------------5. 示例場景假設 run.sh 的內容如下:#!/bin/sh
echo "Normal output"
echo "Error message" >&2 # 通過 >&2 將輸出發送到標準錯誤執行 sh run.sh 2>&1 | tee output.log 會:· 在終端顯示:Normal outputError message· 同時,output.log 文件內容將是:Normal outputError message----------------------------------------6. 與類似命令的區別· 如果不加 2>&1,只執行 sh run.sh | tee output.log:· 標準錯誤(stderr) 會被忽略,只會處理 標準輸出(stdout)。· 如果替換為 sh run.sh &> output.log(某些 Shell 支持的簡寫):· 輸出(包括 stderr)會被寫入文件,但不會顯示到終端。----------------------------------------7. 適用場景這個命令常用于:· 調試腳本:需要實時觀察輸出,同時保留日志供后續分析。· 自動化部署/監控:確保日志記錄完整,同時用戶能實時看到關鍵信息。· 記錄錯誤信息:確保錯誤信息與正常輸出一起被捕獲,便于問題排查。----------------------------------------8. 擴展你可以根據需求調整命令:· 僅保存標準輸出:sh run.sh | tee output.log· 僅保存錯誤信息:sh run.sh 2> error.log· 同時保存到不同文件:sh run.sh > output.log 2> error.log· 將輸出和錯誤合并到同一文件,但不實時顯示:sh run.sh 2>&1 > output.log