`1>>` 和 `2>>` 在 bash 脚本中是什么意思?

Her*_*rot 18 bash io-redirection shell-script

我有以下 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
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 22

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
Run Code Online (Sandbox Code Playgroud)

在脚本的开头。