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

2

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

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

Mike B
источник
Хорошее, но только немецкое объяснение перенаправления в bash, о котором я знаю можно найти здесь ,
nuchoco

Ответы:

4

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

$ sort < data.txt > result.txt

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

$ sort data.txt > result.txt

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

(2 <- 1) -> 3

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

John T
источник
Добро пожаловать! :)
John T
Я думаю, что есть "функциональная разница между" sort data.txt "и" sort & lt; data.txt ". В первом случае утилита должна понимать, как открыть файл в файловой системе и прочитать его. В последующем утилите нужно только понять, как читать текст из «стандартного ввода», которым для доступа к интерактивному терминалу обычно является клавиатура. Я могу ошибаться
pcapademic
3

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

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

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

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

Запуск этого голого будет работать, по крайней мере, в текущем удар версии. Тем не менее, когда вы используете & lt; и & gt; редиректоры, дескрипторы файлов stdin и stdout открываются только для чтения и записи соответственно, поэтому, если вы вызываете это с вводом, перенаправленным из файла -

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

Это не будет работать (достаточно разумно). Если вы действительно хотите, чтобы программа, которую вы вызываете с перенаправлением, могла писать и писать в один файловый дескриптор, & lt; & gt; сделаю работу.

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

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

jmb
источник