Вопрос по <> оператору перенаправления Linux

917
Mike B

Я учусь на LPIC-1, и меня смущает оператор перенаправления <>. Я знаю, что официальное определение для этого состоит в том, что он «заставляет указанный файл использоваться как для стандартного ввода, так и для стандартного вывода» ... но я все еще запутался.

Может ли кто-нибудь привести пример того, как / когда я буду использовать оператор перенаправления <> в Linux?

2
Хорошее, но только для немецкого языка объяснение перенаправления в bash, о котором я знаю [можно найти здесь] (http://wiki.ubuntuusers.de/Shell/Umleitungen). nuchoco 13 лет назад 0

2 ответа на вопрос

4
John T

Примером может служить ситуация, когда вам нужно предоставить входные данные программы, а также отправить куда-нибудь выходные данные (например, файл):

$ sort < data.txt > result.txt 

это запускает данные data.txtчерез команду сортировки и отправляет вывод result.txt. Это идентично выполнению этого:

$ sort data.txt > result.txt 

Думайте об этом так:

(2 <- 1) -> 3 

Средний файл подается в программу под номером 2, а результат в итоге отправляется на 3.

Добро пожаловать! :) John T 14 лет назад 0
I think there is a functional difference between "sort data.txt" and "sort < data.txt". In the former, the utility needs to understand how to open a file in the filesystem and read it. In the later, the utility only needs to understand how to read text from the "standard in", which for an interactive terminal access is commonly the keyboard. I may be wrong. pcapademic 14 лет назад 0
3
jmb

Если ответ Джона Т был именно тем, что вы хотели, значит, вы неправильно сформулировали вопрос :)

Он кратко описал операторы <и>, но вы спросили о <>. Это редко используемый оператор, который я не уверен, что ожидал бы увидеть в LPIC-1, но только для записи (учитывая, что вы, вероятно, уже прошли этот экзамен):

Когда вы в интерактивном режиме запускаете команду без перенаправления, ее стандартный ввод, вывод и ошибка обычно присоединяются к tty; он будет читать со стандартного ввода и писать в стандартный вывод / стандартный вывод. Хотя вы можете этого и не ожидать, эти файловые дескрипторы обычно открываются для чтения и записи. Попробуйте запустить скрипт как

#!/bin/bash echo "I'm writing to stdin!" >&0 

Запуск этого голого будет работать, по крайней мере, в текущих версиях Bash . Однако, когда вы используете редиректоры <и>, дескрипторы файлов stdin и stdout открываются только для чтения и записи соответственно, поэтому, если вы вызываете это с вводом, перенаправленным из файла -

./write-to-stdin < /tmp/some-input 

это не будет работать (достаточно разумно). Если вы действительно хотите, чтобы программа, которую вы вызываете с перенаправлением, могла писать и писать в один дескриптор файла, <> выполнит эту работу.

./read-and-write-stdin <> /tmp/some-input-and-output ./read-and-write-stdout 1<> /tmp/some-input-and-output 

Поскольку большинство программ ожидают, что stdin будет только дескриптором чтения, а stdout - дескриптором записи, вы, вероятно, сможете понять, почему это довольно редко полезно, но если вы пишете подчиненные скрипты (или используете функции), вы можете воспользоваться поведением сам.

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