![執行並儲存日誌](https://rvso.com/image/913182/%E5%9F%B7%E8%A1%8C%E4%B8%A6%E5%84%B2%E5%AD%98%E6%97%A5%E8%AA%8C.png)
我正在透過循環對參數執行腳本並將日誌保存在一個文件中。如何使用 Args 命令一次運行。下面嘗試了 args -n -500
但這並沒有保存日誌,如何在這裡追加保存日誌呢?
答案1
我想你只需要團體內部循環命令並將其輸出重定向到由相同索引索引的文件$i
,然後在後台將所有內容推送到一起&
。就像是
for i in $(cat $file_name)
do
(echo "$i"; /path/script.pl "$i") >> "${file_save}-${i}" &
done
另外for
,cat
在這種情況下,我會以某種方式使用while
and ,read
如下所示:
#!/bin/bash
file_name='in_file'
while IFS= read -r i
do
(echo "$i"; /path/script.pl "$i") >> "${file_save}-${i}" 2>&1 &
done < "$file_name"
2>&1
如果您希望在日誌檔案中包含錯誤訊息,請新增以下內容。有關該構造的更多資訊IFS= read -r line
可以在此處找到百科全書式的答案由@StéphaneChazelas 提供。
此外,如果執行./script.pl
需要很長時間,您可以從目前 shell 中分離,以防您意外關閉啟動主腳本的終端視窗。為此,您可以使用nohup mycommand &
而只是&
.
根據上述場景,將所有日誌合併到一個文件中的最簡單方法可能是再次使用循環(一旦主腳本中的所有作業完成),如下所示:
#!/bin/bash
file_name='in_file'
merged_log='out_file'
>"$merged_log" # empty the merged log file - not mandatory if the file doesn't exist
while IFS= read -r i
do
cat "${file_save}-${i}" >> "$merged_log"
rm "${file_save}-${i}"
done < "$file_name"
這也應該有效:
#!/bin/bash
file_name='in_file'
merged_log='out_file'
while IFS= read -r i
do
cat "${file_save}-${i}"
rm "${file_save}-${i}"
done < "$file_name" > "$merged_log"
答案2
如果寫入順序不重要,
for i in $(cat $file_name);do echo $i; ./script.pl $i>>file & done
這是平行的。