Что означают `1 >>` и `2 >>` в скрипте bash?

15

У меня есть следующий скрипт bash, из того, что я понимаю >>, используется для добавления вывода команды в существующий файл вместо перезаписи, но что он делает в этом случае? Этот скрипт вызывает некоторые исполняемые файлы для преобразования из одного формата в другой. Для каждого файла существует много лет, поэтому он просматривает каждый файл, просматривая имя файла. Также, когда я запускаю этот скрипт, я получаю «неоднозначное перенаправление»

#!/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
Герман Зуб
источник
Как вы называете этот сценарий?
Хауке Лагинг
возможный дубликат Ambigous перенаправления сделано> $ 2
Hauke ​​Laging
@ HaukeLaging, нет, это не так. Вопрос вроде бы о чем-то близком, но не одном и том же
Ромео Нинов
@RomeoNinov Не могли бы вы объяснить соответствующую разницу?
Хауке Лагинг
@HaukeLaging скрипт сохраняется в файле .sh. Я просто печатаю ./myscript.sh
Герман Тутрот

Ответы:

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являются пустыми, и поэтому являются $joboutи $joberr.

Вы должны вызвать скрипт так:

./myscript.sh file1 file2
Хауке Лагинг
источник
Номера параметров не имеют ничего общего с числами перед >>операторами перенаправления.
Бармар
Неважно, я вижу, что вы отвечаете на часть о неоднозначном перенаправлении, а не вопрос в названии. Вы, вероятно, должны прояснить свой ответ по этому поводу.
Бармар