Да, я уже попытался искать его в другом месте, но примеры, которые, как предполагается, иллюстрируют перенаправление ввода, как здесь, например, всегда имеют один запутывающий протест. В примере сайта, просто отправленного, они говорят:
# echo 'hello world' >output
# cat <output
Первая строка пишет "привет мир" в файл "вывод", вторые чтения это назад и записи это к стандартному выводу (обычно терминал).
Однако cat output
сделал бы ту же самую вещь, никакой noeed для <
здесь. Таким образом, каково различие??
Перенаправление ввода (как в 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
, это было следующим доступным.
В основном различия:
cat output.txt
: читает содержание файла output.txt к стандартный вывод непосредственно
cat < output.txt
: вывод (или содержание) output.txt через вводимый символ стандарта перенаправления (<
) читается эти cat
команда. Следовательно output.txt используется вход для <
команда.
вывод для обоих методов будет тем же, но дополнительный путь взят во втором методе в результате <
вводимый символ стандарта перенаправления.