История изменений
Исправление evilface, (текущая версия) :
Почитай про команды-фильтры.
Если кратко, то это команды, умеющие принимать данные на стандартный поток ввода (условно, с клавиатуры) и выводить на стандартный поток вывода (монитор).
Перенаправление вида cat < filename
заключается в привязывании файлового дескриптора 0
к файлу filename
вместо устройства ввода.
Что это даёт?
Возьмём команду wc
. Посчитаем количество строк двумя способами.
$ wc -l ./ann
35 ./ann
$ wc -l < ./ann
35
Здесь wc имеет разное поведение. В первом случае, ей был файл передан аргументом командной строки. Она взяла по нему статистику и вывела с его именем.
Во втором же случае ей был «как будто» с терминала руками подано на вход содержимое файла. Она об этом (в упращённом случае) даже не знала. Работа была аналогичной, как если бы аргументов не было (а их действительно не было) и данные были поданы на стандартный ввод (а так и было).
Конструкции вида
< file, > file, cmd|cmd2
и им подобные обрабатываются на уровне шелла, запускающего твои программы. Как следствие, можно составлять цепочки, называемые «конвейерами». Но это отдельный разговор.Возвращаясь к первому примеру.
Предположим, мы хотим посчитать количество строк в file1 и вывести в file2. Как сделать это просто с wc? Можно сделать
wc -l file1 …
, но тогда вывод будет содержать и имя файла, а мы хотим только количество линий. Значит, нам подойдёт в данном случае второй способ, с перенаправлением и мы сможем перенаправить вывод сразу в file2. Вот так: wc -l < file1 > file2
.Надеюсь, более-менее понятно, в чём суть.
А конкретно
cat
умеет принимать данные на вход потому что он тоже фильтр. И он умеет их преобразовывать. Например, есть cat -n
, который выведет строки с нумерами. Можно написать какую-то команду, которая будет выдавать результат, а потом (если нам зачем-то надо) пронумеровать строки, передав это по конвейеру (... | cat -n
).Случай с
cat < filename
— побочный эффект того, что перенаправления парсятся оболочкой, которая это всё запускает, а значит можно и такое, хотя имеет не очень много применений. Касательно echo
— как уже сказали, оно не принимает на ввод ничего. В программу, не читающую ввода с клавиатуры бессмысленно что-то направлять. Всё что echo делает — берёт свои аргументы и выводит.
Как-то так.
Исправление evilface, :
Почитай про команды-фильтры.
Если кратко, то это команды, умеющие принимать данные на стандартный поток ввода (условно, с клавиатуры) и выводить на стандартный поток вывода (монитор).
Перенаправление вида cat < filename
заключается в привязывании файлового дескриптора 0
к файлу filename
вместо устройства ввода.
Что это даёт?
Возьмём команду wc
. Посчитаем количество строк двумя способами.
$ wc -l ./ann
35 ./ann
$ wc -l < ./ann
35
Здесь wc имеет разное поведение. В первом случае, ей был файл передан аргументом командной строки. Она взяла по нему статистику и вывела с его именем.
Во втором же случае ей был «как будто» с терминала руками подано на вход содержимое файла. Она об этом (в упращённом случае) даже не знала. Работа была аналогичной, как если бы аргументов не было (а их действительно не было) и данные были поданы на стандартный ввод (а так и было).
Конструкции вида
< file, > file, cmd|cmd2
и им подобные обрабатываются на уровне шелла, запускающего твои программы. Как следствие, можно составлять цепочки, называемые «конвейерами». Но это отдельный разговор.Возвращаясь к первому примеру.
Предположим, мы хотим посчитать количество строк в file1 и вывести в file2. Как сделать это просто с wc? Можно сделать
wc -l file1 …
, но тогда вывод будет содержать и имя файла, а мы хотим только количество линий. Значит, нам подойдёт в данном случае второй способ, с перенаправлением и мы сможем перенаправить вывод сразу в file2. Вот так: wc -l < file1 > file2
.Надеюсь, более-менее понятно, в чём суть.
А конкретно
cat
умеет принимать данные на вход потому что он тоже фильтр. И он умеет их преобразовывать. Например, есть cat -n
, который выведет строки с нумерами. Можно написать какую-то команду, которая будет выдавать результат, а потом (если нам зачем-то надо) пронумеровать строки, передав это по конвейеру (... | cat -n
).Случай с
cat < filename
— побочный эффект того, что перенаправления парсятся оболочкой, которая это всё запускает, а значит можно и такое, хотя имеет не очень много применений. Касательно
echo
— как уже сказали, оно не принимает на ввод ничего. В программу, не читающую ввода с клавиатуры бессмысленно что-то направлять. Всё что echo делает — берёт свои аргументы и выводит.
Как-то так.
Исправление evilface, :
Почитай про команды-фильтры.
Если кратко, то это команды, умеющие принимать данные на стандартный поток ввода (условно, с клавиатуры) и выводить на стандартный поток вывода (монитор).
Перенаправление вида cat < filename
заключается в привязывании файлового дескриптора 0
к файлу filename
вместо устройства ввода.
Что это даёт?
Возьмём команду wc
. Посчитаем количество строк двумя способами.
$ wc -l ./ann
35 ./ann
$ wc -l < ./ann
35
Здесь wc имеет разное поведение. В первом случае, ей был файл передан аргументом командной строки. Она взяла по нему статистику и вывела с его именем.
Во втором же случае ей был «как будто» с терминала руками подано на вход содержимое файла. Она об этом (в упращённом случае) даже не знала. Работа была аналогичной, как если бы аргументов не было (а их действительно не было) и данные были поданы на стандартный ввод (а так и было).
Конструкции вида
< file, > file, cmd|cmd2
и им подобные обрабатываются на уровне шелла, запускающего твои программы. Как следствие, можно составлять цепочки, называемые «конвейерами». Но это отдельный разговор.Возвращаясь к первому примеру.
Предположим, мы хотим посчитать количество строк в file1 и вывести в file2. Как сделать это просто с wc? Можно сделать
wc -l file1 …
, но тогда вывод будет содержать и имя файла, а мы хотим только количество линий. Значит, нам подойдёт в данном случае второй способ, с перенаправлением и мы сможем перенаправить вывод сразу в file2. Вот так: wc -l < file1 > file2
.Надеюсь, более-менее понятно, в чём суть.
А конкретно
cat
умеет принимать данные на вход потому что он тоже фильтр. И он умеет их преобразовывать. Например, есть cat -n
, который выведет строки с нумерами. Можно написать какую-то команду, которая будет выдавать результат, а потом (если нам зачем-то надо) пронумеровать строки, передав это по конвейеру (... | cat -n
).Случай с
cat < filename
— побочный эффект того, что перенаправления парсятся оболочкой, которая это всё запускает, а значит можно и такое, хотя имеет не очень много применений. Как-то так.
Исходная версия evilface, :
Почитай про команды-фильтры.
Если кратко, то это команды, умеющие принимать данные на стандартный поток ввода (условно, с клавиатуры) и выводить на стандартный поток вывода (монитор).
Перенаправление вида cat < filename
заключается в привязывании файлового дескриптора 0
к файлу filename
вместо устройства ввода.
Что это даёт?
Возьмём команду wc
. Посчитаем количество строк двумя способами.
$ wc -l ./ann
35 ./ann
$ wc -l < ./ann
35
Здесь wc имеет разное поведение. В первом случае, это была команда ей был файл передан аргументом командной строки. Она взяла по нему статистику и вывела с его именем.
Во втором же случае ей был «как будто» с терминала руками подано на вход содержимое файла. Она об этом (в упращённом случае) даже не знала. Работа была аналогичной, как если бы аргументов не было (а их действительно не было) и данные были поданы на стандартный ввод (а так и было).
Конструкции вида
< file, > file, cmd|cmd2
и им подобные обрабатываются на уровне шелла, запускающего твои программы. Как следствие, можно составлять цепочки, называемые «конвейерами». Но это отдельный разговор.Возвращаясь к первому примеру.
Предположим, мы хотим посчитать количество строк в file1 и вывести в file2. Как сделать это просто с wc? Можно сделать
wc -l file1 …
, но тогда вывод будет содержать и имя файла, а мы хотим только количество линий. Значит, нам подойдёт в данном случае второй способ, с перенаправлением и мы сможем перенаправить вывод сразу в file2. Вот так: wc -l < file1 > file2
.Надеюсь, более-менее понятно, в чём суть.
А конкретно
cat
умеет принимать данные на вход потому что он тоже фильтр. И он умеет их преобразовывать. Например, есть cat -n
, который выведет строки с нумерами. Можно написать какую-то команду, которая будет выдавать результат, а потом (если нам зачем-то надо) пронумеровать строки, передав это по конвейеру (... | cat -n
).Случай с
cat < filename
— побочный эффект того, что перенаправления парсятся оболочкой, которая это всё запускает, а значит можно и такое, хотя имеет не очень много применений. Как-то так.