我有以下 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