Shell-Script

將用於執行腳本(stdin)、stdout 和 stderr 的命令列印到文件中的簡潔方法

  • August 2, 2022

我試圖在 bash 中執行腳本:cc.sh

要執行 bash 腳本:

../cc.sh ../seq/ seqf

where../seq/seqf都是需要的參數。

我想將用於執行腳本的命令(上面的命令)與腳本的輸出/結果一起保存到日誌文件中。

我設法使用tee命令將輸出列印到日誌文件中。

../cc.sh ../seq/ seqf 2<&1 | tee -a cc.log

cat抄送日誌:

"here is where the output shown"

而對於命令本身,我得到的最接近的是script命令。但是,它似乎將我用來執行的命令保存在二進製文件中。

除了列印命令還有其他更好的方法script嗎?或者更好的是,將用於執行腳本文件的命令連同輸出/結果一起列印到日誌文件中?

日誌文件的預期輸出:

COMMAND: ../cc.sh ../seq/ seqf
"here is where the output shown"

最簡單的方法是修改您的腳本,使其將其名稱和參數列表列印到標準輸出。例如,如果您的腳本文件包含echo $0 $@作為第一行,它將列印您需要的資訊(假設它使用 sh 並從 bash 啟動):

#!/bin/sh
echo "$0 $@"

然後你可以將標準輸出重定向到文件、三通或任何你想要的。

使用數組來儲存命令及其參數。將命令(數組)列印到輸出文件,然後執行命令。通過管道將所有輸出tee附加到cc.log文件中:

mycommand=( ../cc.sh ../seq/ seqf )

{
   printf 'COMMAND: %s\n' "${mycommand[*]}"
   "${mycommand[@]}"
} | tee -a cc.log

這將創建數組mycommand並將其元素設置為命令及其參數。然後列印該命令,並以字元串 為前綴COMMAND: 。擴展"${mycommand[*]}"將是由數組的第一個字元$IFS(通常是空格)分隔的元素組成的單個字元串。

擴展"${mycommand[@]}"將是單個引用字元串的列表,即命令及其單獨引用的參數。像這樣使用擴展會導致命令被正確呼叫。

兩者的輸出printf和命令一個接一個地一起重定向到tee,因為它們是同一複合命令 ( {...;}) 的一部分。

或者,使用位置參數列表而不是命名數組,

set -- ../cc.sh ../seq/ seqf

{
   printf 'COMMAND: %s\n' "$*"
   "$@"
} | tee -a cc.log

請注意,這適用於任何命令,無論是 shell 腳本還是編譯的二進制執行檔。

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