LINUX.ORG.RU

История изменений

Исправление 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 — побочный эффект того, что перенаправления парсятся оболочкой, которая это всё запускает, а значит можно и такое, хотя имеет не очень много применений.

Как-то так.