我有一个循环迭代的 bash 脚本。如何根据迭代将各个脚本的输出保存在 bash 文件中?
#Working directory
cd /lustre/nobackup/WUR/ABGC/agyir001/
# Set the number of replicates
num_replicates=100
# Loop over the replicates
for i in $(seq 1 $num_replicates); do
# replicate number with leading zeros
rep_num=$(printf "%03d" $i)
output_file="accuracy_results_${rep_num}.txt"
#Run scenario 1,2 and 3 of male contributions
Rscript Scenario_1_male_contributions.R
Rscript Scenario_2_male_contributions.R
Rscript Scenario_3_male_contributions.R
#creating correlated qtl effects for 1000 selected qtls
Rscript Correlated_qtl_effects.R
#Selecting 1000 qtls, creating TBVS and phenotypes
Rscript Breeding_values_and_Phenotypes.R 7500
# prepare phenotypes and genotypes/markers
Rscript /lustre/nobackup/WUR/ABGC/agyir001/scripts/Markers_phenotypes_for_EBV.R
答案1
如果要将单个命令的输出保存到变量中命名的文件中output_file
,则可以使用常规重定向:
Rscript Scenario_1_male_contributions.R > "$output_file"
或者如果您想要 stdout 和 stderr
Rscript Scenario_1_male_contributions.R > "$output_file" 2>&1
如果您希望将多个命令的输出输出到同一个文件,则需要为每个命令添加重定向,并使用>>
追加模式,而不是>
每次都会截断文件。
但是,单独向每个重定向添加重定向可能会有点麻烦,因此您可能需要在那里使用命令分组:
{
Rscript Scenario_1_male_contributions.R
Rscript Scenario_2_male_contributions.R
Rscript Scenario_3_male_contributions.R
} > "$output_file"
在这里,常规重定向>
是可以的,因为文件只为整个组打开一次。也就是说,假设您不想在文件中保存先前运行的脚本的任何数据。
或者,在循环中将所有Rscript
调用的输出保存在同一文件中:
for i in $(seq 1 $num_replicates); do
# replicate number with leading zeros
rep_num=$(printf "%03d" $i)
output_file="accuracy_results_${rep_num}.txt"
{
#Run scenario 1,2 and 3 of male contributions
Rscript Scenario_1_male_contributions.R
Rscript Scenario_2_male_contributions.R
Rscript Scenario_3_male_contributions.R
Rscript ...
} > "$output_file"
done