Исходное перенаправление bash – в чем разница между >> и> &, перенаправлением и дублированием?

Я пытаюсь понять перенаправление вывода, но я борется. Я не думаю, что у меня действительно есть различия.

1 > file # - redirect stdout to file (override mode) 1 >> file # - redirect stdout to file (append mode) 2 > 1 # 1) would that also redirect stderr to stdout, replacing stdout? 2 >> 1 # 2) would this redirect stderr to stdout (appending to it, # ie haivng both sent to stdout?) 1>&9 # - duplicates stdout to file descriptor (pointer) 9 # 3) what's the difference of 2>&1 to a 2 >> 1? Does >> only run at the end # of output? echo foo > file # - redirects output to file (override mode) >file 2>&1 # - duplicates stderr to stdout, then redirects to file in override mode # 4) why is this giving me stdout, too, when the syntax is 2>&1, # ie duplicate stderr into stdout - not merge 2 into 1? 

Я предполагаю, что амперсанд & означает дубликат, а не перенаправление. Но какая разница в перенаправлении a на b (останется без изменений?), Чтобы дублировать a на b (будут a а и b одинаковыми?)? 2>&1 видимому, перенаправляет и объединяет 2 в 1 , т. Е. То, что ушло бы в 2 , теперь находится в 1 , но только в 1 … почему?

Я весьма озадачен…

2 Solutions collect form web for “Исходное перенаправление bash – в чем разница между >> и> &, перенаправлением и дублированием?”

Во-первых, что-либо после > или >> является именем файла; поэтому > 1 записывается в файл с именем 1 .

Номера в других формах, приведенные в вашем примере, являются файловыми дескрипторами. По умолчанию программы начинаются с файловых дескрипторов 0 (стандартный ввод), 1 (стандартный вывод) и 2 (стандартная ошибка); когда вы запускаете программу из интерактивной оболочки, они подключаются к вводу и выводу терминала (вы можете увидеть их, запустив ls -l /proc/$$/fd в Linux).

Указание числа до > , >> или >& указывает дескриптор файла, который вы хотите манипулировать; номер должен быть справа перед символом > . таким образом

 echo Example 2> stderr 

напечатает «Пример» и создаст пустой файл stderr (который будет содержать все, что отправлено на стандартную ошибку).

Вы можете думать о дескрипторах файлов как записи в таблице, указывая на файлы; таким образом, по умолчанию:

  • 0 очков в /dev/tty
  • 1 балл на /dev/tty
  • 2 балла в /dev/tty

Указание 1> file (или просто > file ) обновляет дескриптор файла 1 до точки в file , открытый в режиме усечения (поэтому его содержимое заменяется). Указание 2> 1 обновляет дескриптор файла 2, указывая на файл с именем 1 , открытый в режиме усечения.

Дублирование дескрипторов файлов с использованием >& (или &> , которая является предпочтительной формой) просто обновляет один дескриптор файла, чтобы указать на то, что указывает другой. В вашем последнем примере, > file обновляет дескриптор файла 1:

  • 0 очков в /dev/tty
  • 1 балл к file
  • 2 балла в /dev/tty

а затем 2>&1 обновляет дескриптор файла 2:

  • 0 очков в /dev/tty
  • 1 балл к file
  • 2 балла в file

(порядок значителен: > file 2>&1 создает выше, 2>&1 > file будет только перенаправлять дескриптор файла 1).

Форма 1>&9 работает только в том случае, если файловый дескриптор 9 был открыт, например, путем копирования дескриптора файла 1 в него ( 9>&1 ) или открытия файла ( 9> file ). Этот тип конструкции может быть полезен для отслеживания исходного содержимого файловых дескрипторов при перенаправлении; таким образом, в скрипте вы можете безопасно копировать 1 и 2, перенаправить стандартный вывод и ошибку для любой цели, которая вам нужна, а затем восстановить их …

В руководстве Bash есть все подробности.

У вас были некоторые неправильные предположения.


Общий синтаксис для перенаправления:

 [n]redirection-operator word 

где n – десятичное число, обозначает файловый дескриптор. Обратите внимание, что между n и redirection-operator нет пробела.


Чтобы перенаправить стандартный вывод в файл, вам необходимо:

 > file 

или:

 1> file 

1 > file означает выполнение команды 1 и перенаправление ее вывода в file или явно то же самое, что:

 1 1> file 

То же самое для стандартной ошибки 2> file и >> оператор.


Чтобы дублировать файловый дескриптор, вы будете использовать:

  • [n]<&word для дескриптора входного файла
  • [n]>&word для дескриптора выходного файла
  • [n]<>word для открытия дескриптора файла для чтения и записи

Все вышеперечисленное является стандартным синтаксисом, который будет работать, если вы используете #!/bin/sh для своего скрипта.

Некоторые оболочки имеют свои собственные расширения, например bash с >& для перенаправления как стандартной, так и стандартной ошибки, ksh93 с помощью <>; для усечения до смещения при завершении команды.


Теперь вы можете видеть их различия.

Оператор дублирования работает только с файловыми дескрипторами, а оператор перенаправления работает только с файлами (которые сопоставляются с файловыми дескрипторами под капотом).

  • BASH: передать аргументы в подзапись
  • Удалить строку с пробелами и цитатами из xml-файла
  • Есть ли что-то эквивалентное getch () в ksh?
  • Почему команда history ничего не делает в файле сценария?
  • Сценарий, который удаляет нежелательные символы из переменной
  • Удалить файлы, кроме n файлов с «большим» именем?
  • Как подписать скрипт Bash в качестве клиента MQTT
  • Как принять переменную
  • Как сравнить два числа
  • выйти из сценария оболочки
  • Сравните два файла .csv
  • Linux и Unix - лучшая ОС в мире.