保存各个 shell 脚本的输出

保存各个 shell 脚本的输出

我有一个循环迭代的 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

相关内容