bash 脚本中的“1>>”和“2>>”是什么意思?

bash 脚本中的“1>>”和“2>>”是什么意思?

我有以下 bash 脚本,据我了解 >> 用于将命令的输出附加到现有文件而不是覆盖,但在这种情况下它在做什么?该脚本正在调用一些 exe 文件以从一种格式转换为另一种格式。每个文件都有很多年,因此它通过查看文件名来循环遍历每个文件。另外,当我运行此脚本时,我得到“不明确的重定向”

#!/bin/bash
source $HOME/.bashrc

jobout=${1}
joberr=${2}

# Set some paths and prefixes

yr_bgn=2000
yr_end=2000

yr=${yr_bgn}
pth_data='/mnt/'
pth_rst='/mnt/'



while [ ${yr} -le ${yr_end} ]
do
   ./executable1 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   ./executable2 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   ./executable3 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr}
   let yr=${yr}+1
done

答案1

1>>2>>是特定文件描述符的重定向,在本例中是标准输出(文件描述符 1)和标准错误(文件描述符 2)。

因此,该脚本将所有“标准”消息重定向到 ,${jobout}并将所有错误消息重定向到${joberr}.在这两种情况下使用>>意味着所有消息都附加到各自的文件中。

请注意,${jobout}${joberr}从脚本的两个命令行参数中获取它们的值(${1}${2}),因此您需要指定要用于存储消息的文件。如果没有给出参数,脚本将产生您所看到的“不明确的重定向”错误消息;该脚本应该真正检查是否已提供参数并生成适当的错误消息,否则,类似于

if [ -z "$1" -o -z "$2" ]; then
    echo "Log files for standard and error messages must be specified"
    echo "${0} msgfile errfile"
    exit 1
fi

在脚本的开头。

答案2

在您的情况下 1>> 将当前 stdout 处理程序中的信息附加到文件 ${jobout} 2>> 将当前 stderr 处理程序中的信息附加到文件 ${joberr}

jobout 和 joberr 是文件,定义为脚本的第一个和第二个参数

答案3

由于调用脚本时没有参数,因此参数$1$2为空,因此 和 也是空$jobout$joberr

您必须像这样调用脚本:

./myscript.sh file1 file2

相关内容