2

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

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

2 ответа2

4

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

$ sort < data.txt > result.txt

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

$ sort data.txt > result.txt

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

(2 <- 1) -> 3

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

3

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

Он кратко описал операторы <и>, но вы спросили о <>. Это редко используемый оператор, который я не уверен, что ожидал бы увидеть в 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 - дескриптором записи, вы, вероятно, сможете понять, почему это довольно редко полезно, но если вы пишете подчиненные скрипты (или используете функции), вы можете воспользоваться поведением сам.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .