Shell-Script
將用於執行腳本(stdin)、stdout 和 stderr 的命令列印到文件中的簡潔方法
我試圖在 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 腳本還是編譯的二進制執行檔。