Що означають `1 >>` та `2 >>` у bash-скрипті?


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


@HaukeLaging, ні, це не так. Здається, питання йде про щось близьке, але не те саме
Ромео Нінов

@RomeoNinov Ви б не заперечили пояснити відповідну різницю?
Hauke ​​Laging

@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

Номери параметрів не мають нічого спільного з числами перед >>операторами перенаправлення.
Бармар

Неважливо, я бачу, що ви відповідаєте на частину про неоднозначне переспрямування, а не на питання в заголовку. Напевно, ви повинні зробити свою відповідь зрозумілішою з цього приводу.
Бармар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.