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


2

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

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


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

Ответы:


4

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

$ sort < data.txt > result.txt

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

$ sort data.txt > result.txt

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

(2 <- 1) -> 3

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.