Как перенаправление ввода работает?

Да, я уже попытался искать его в другом месте, но примеры, которые, как предполагается, иллюстрируют перенаправление ввода, как здесь, например, всегда имеют один запутывающий протест. В примере сайта, просто отправленного, они говорят:

  # echo 'hello world' >output
  # cat <output

Первая строка пишет "привет мир" в файл "вывод", вторые чтения это назад и записи это к стандартному выводу (обычно терминал).

Однако cat output сделал бы ту же самую вещь, никакой noeed для < здесь. Таким образом, каково различие??

4
задан 16 February 2017 в 00:56

2 ответа

Перенаправление ввода (как в cat < file) означает, что оболочка открывает входной файл и пишет его содержание в стандартный вход другого процесса. Передача файла как аргумент (как Вы делаете при выполнении cat file) означает программу, которую Вы используете (например. cat) потребности открыть сам файл и считать содержание.

В основном, command file передает файл command в то время как command < file передает содержание файла к command. Да, в случаях как cat file по сравнению с cat < file нет никакого легко воспринятого различия в результате, но но эти два работают по-разному.

Для понимания различия думайте о маленьком ребенке и взрослом. Они оба могут выпить воду. Однако взрослый может открыть касание и заполниться, стекло (откройте файл и считайте его содержание), в то время как ребенку нужна вода, которая будет дана ему непосредственно (это не может открыть файл и может только обработать его содержание).

Некоторые программы, как cat, способны к взятию имени файла, как введено и затем открытию файла и выполнению их вещи на нем. Вот почему cat file работы. Другие программы, однако, не имеют никакого знания того, что файлы или как использовать их. Все, о чем они знают, является входными потоками (как содержание файла). Например, tr:

$ cat file
foo
$ cat file | tr 'o' 'b'  ## tr can read a stream
fbb
$ tr 'o' 'b' file  ## tr can't deal with files
tr: extra operand ‘file’
Try 'tr --help' for more information.
$ tr 'o' 'b' < file ## input redirection!
fbb

Другой пример ls который может иметь дело с файлами очень хорошо, но игнорирует входные потоки:

$ ls
file1  file2
$ ls file1   ## lists only file1: ls takes file names as arguments
file1
$ ls < file1 ## ls ignores its standard input, this is the same as ls alone
file1 file2

Другие программы не могут иметь дело с потоками и вместо этого потребовать файлов:

$ rm < file ## fails, rm needs a file 
rm: missing operand
Try 'rm --help' for more information.
$ rm file ## works, file is deleted

Некоторые программы могут иметь дело и с вводными файлами и с чтением входных потоков, но вести себя по-разному с каждым. Например, wc который при предоставлении файла для открытия печатает название файла, а также количество строк, слов и символов:

$ wc file
1 1 4 file

Но, если мы просто даем ему поток, это не имеет никакого способа знать, что это прибывает из определенного файла, таким образом, никакое имя файла не печатается:

$ wc < file
1 1 4

md5sum команда ведет себя так же:

$ md5sum file
17fd54512c91e3cd0f70fbaaa9a94d0d  file
$ md5sum < file
17fd54512c91e3cd0f70fbaaa9a94d0d  - 

Отметьте это в первом случае имя файла file показан, в то время как, во втором, "имени файла" -: стандартный вход.


Теперь, если Вы хотите более песчаные детали, можно использовать strace для наблюдения точно, что продолжается:

strace -e trace=open,close,read,write wc file 2>strace1.txt

и

strace -e trace=open,close,read,write wc < file 2>strace2.txt

У этого будут все подробности всех open(), close() и read() операции выполняются процессом. То, что Вы хотите видеть, является этим strace1.txt (когда файл был передан как аргумент, а не с перенаправлением ввода) содержит эти строки:

open("file", O_RDONLY)                  = 3
read(3, "foo\n", 16384)                 = 4

Они подразумевают что файл file был открыт и присоединен к дескриптору файла 3. Затем строка foo\n был считан из 3. Эквивалентная часть strace вывод при использовании перенаправления ввода:

read(0, "foo\n", 16384)                 = 4

Нет никакого соответствия open() звоните, вместо этого строка foo\n читается из 0, стандарт input1.


1 По умолчанию, 0 стандартный вход, 1 стандартный вывод и 2 стандартная погрешность. Это, между прочим, то, почему file был открыт как 3, это было следующим доступным.

5
ответ дан 1 December 2019 в 09:21

В основном различия:

  1. cat output.txt: читает содержание файла output.txt к стандартный вывод непосредственно

  2. cat < output.txt: вывод (или содержание) output.txt через вводимый символ стандарта перенаправления (<) читается эти cat команда. Следовательно output.txt используется вход для < команда.

вывод для обоих методов будет тем же, но дополнительный путь взят во втором методе в результате < вводимый символ стандарта перенаправления.

1
ответ дан 1 December 2019 в 09:21

Другие вопросы по тегам:

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