Что делает “3> &1 1>, &2 2> &3” делает в сценарии?

Если можно высказать разумное предположение как, туда, где команда расположена, конфетка может сказать Вам, в каком пакете это находится.

# yum resolvedep /usr/bin/timeconfig
No Package Found for /usr/bin/timeconfig

# yum resolvedep /usr/sbin/timeconfig
0:system-config-date-1.8.12-4.el5.noarch
69
02.07.2014, 22:45
4 ответа

Числа являются дескрипторами файлов, и только первые три (запускающийся с нуля) имеют стандартизированное значение:

0 - stdin
1 - stdout
2 - stderr

Так каждое из этих чисел в Вашей команде относятся к дескриптору файла. Можно или перенаправить дескриптор файла в файл с > или перенаправьте его к другому дескриптору файла с >&

3>&1 в Вашей командной строке создаст новый дескриптор файла и перенаправит его к 1 который является STDOUT. Теперь 1>&2 перенаправит дескриптор файла 1 к STDERR и 2>&3 перенаправит дескриптор файла 2 - 3, который является STDOUT.

Так в основном Вы переключились STDOUT и STDERR, это шаги:

  1. Создайте новый fd 3 и укажите на него на fd 1
  2. Перенаправьте дескриптор файла 1 к дескриптору файла 2. Если бы мы не сохранили бы дескриптор файла в 3, мы потеряли бы цель.
  3. Перенаправьте дескриптор файла 2 к дескриптору файла 3. Теперь дескрипторы файлов один и два переключаются.

Теперь, если программа распечатает что-то к дескриптору файла 1, то это будет распечатано к дескриптору файла 2 и наоборот.

77
27.01.2020, 19:31

Это подкачивает stdout и stderr.

>name средства перенаправляют вывод в файл name.

>&number средства перенаправляют вывод к дескриптору файла number.

Так & необходим, чтобы сказать оболочке, что Вы имеете в виду дескриптор файла, не имя файла.

Дескриптор файла является числом, которое относится к уже открытому файлу. Стандартные 0 для стандартного входа, 1 для стандартного вывода или 2 для стандартной погрешности. Можно также использовать любое другое число, которое создаст новый дескриптор файла, точно так же, как когда Вы создадите новую переменную с var=value.

По умолчанию, оба дескриптора файла 1 и 2 перейдите в /dev/tty, таким образом, если Вы работаете somecommand 3>&1 1>&2 2>&3 в новой оболочке это ничего не изменяет (кроме теперь, у Вас есть дескриптор файла номер 3).

Но если где-нибудь ранее в сценарии это делает перенаправление с помощью должностного лица (например. exec 2>error.log), или скрипт запущен с командной строкой включая перенаправление (например. ./thescript 2>error.log), затем свопинг stdout и stderr сделает что-то.

В Вашем конкретном случае команда это имеет ее stdout, и подкачанный stderr dialog. Смотря на его страницу справочника, я вижу

Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error

таким образом, возможно, человек, который записал сценарий, хочет dialogвывод для движения в stdout вместо stderr по некоторым причинам.

См. также Порядок перенаправлений

20
27.01.2020, 19:31

Сценарист определил fd 3, например:

exec 3<> File.txt

Откройте "File.txt" и назначьте ему fd 3. Максимальное количество файловых дескрипторов :255

read -n 4 <&3

Чтение только 4 символов.

echo -n. >&3

Напишите там десятичную точку.

exec 3>&-

Закрыть fd 3.

cat File.txt

==> 1234.67890

5
20.08.2021, 13:24

Я понял назначение файлового дескриптора и команды «3> & 1 1> & 2 2> & 3» на примере ниже

#!/bin/bash
#it's normal case fd enviroment

echo test 1> afile.txt

echo test1111111111111

cat afile.txt

echo test1111111111111

echo test 2> afile.txt

echo test2222222222222

cat afile.txt

echo test2222222222222


e1cho test 1> afile.txt

echo test333333333333


cat afile.txt

echo test333333333333

ec1ho test 2> afile.txt

echo test4444444444444

cat afile.txt

echo test444444444444

echo > afile.txt

echo ------------------------------------------------------------------------------------------------------

#it's relocate filedescriptor and cause not problem, and cause error(std error)

var=

var=$(echo test 3>&1 1>&2 2>&3)

echo test555555555555

#cat afile.txt

echo $var
echo test555555555555

var=

var=$(ec1ho test 3>&1 1>&2 2>&3)

echo test6666666666666

#cat afile.txt

echo $var

echo test666666666666

var=

var=$(ec1ho test 3>&1 1>&2 2>&3)

echo test77777777777777

#cat afile.txt

echo $var

echo test77777777777777

var=

var=$(echo test 3>&1 1>&2 2>&3)

echo test88888888888888

#cat afile.txt

echo $var

echo test8888888888888

Когда вы запустите этот пример, вы увидите, что файловые дескрипторы переупорядочиваются, а выходные данные изменяются.

0
20.08.2021, 13:24

Теги

Похожие вопросы