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


15

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

您如何称呼此脚本?
Hauke Laging 2015年


@HaukeLaging,不,不是。问题似乎是关于一些接近但不相同的问题
Romeo Ninov

@RomeoNinov您介意解释相关差异吗?
Hauke Laging

@HaukeLaging脚本保存在.sh文件中。我只输入./myscript.sh
Herman Toothrot

Answers:


19

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是文件,定义为脚本的第一个和第二个参数


1

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

您必须像这样调用脚本:

./myscript.sh file1 file2

参数编号与>>重定向运算符之前的编号无关。
Barmar 2015年

没关系,我看到您正在回答有关歧义重定向的部分,而不是标题中的问题。您可能应该对此做出更清晰的回答。
Barmar 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.