我正在通过循环执行 Arguments 上的脚本并将日志保存在一个文件中。如何使用 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
这样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
这是平行的。