Перенаправление трубы и стандартного ввода на кошку

Почему

echo "hello world" | cat

работает пока

cat < echo "hello world"

не? Моя (неверная) интуиция в том, что канал перенаправит stdout в cat как stdin,

2 ответа

Решение

У нас есть две похожие, но разные вещи

  • Трубопровод

    echo "hello world" | cat   # This is a pipeline
    

    Операторы по контролю труб (| а также |&) соедините вывод команды со входом следующей в конвейере. Итак, первый пример работает, вывод echo Команда "Hello word" связана с вводом следующего cat команда, которая предполагает стандартный ввод в качестве входного файла, если не указано иное. На самом деле мы можем читать из man cat:

    cat - объединяет файлы и печатает на стандартный вывод

    и ниже примера с простым вызовом cat

    cat Copy standard input to standard output

  • Перенаправление или лучше попытка перенаправления ввода <

    cat < echo "hello world"   # This is an attempt of redirection 
    

    В этом случае cat Команда берет свой ввод из стандартного ввода, который вы перенаправляете с оператором < из файла на правой стороне <... это не файл. Это потому, что это не работает.

    Из раздела перенаправления man bash

    Перенаправление ввода
    Перенаправление ввода вызывает открытие файла, имя которого является результатом раскрытия слова, для чтения по дескриптору файла n или стандартного ввода (дескриптор файла 0), если n не указано.

  • В bash это работает по разным причинам

    • cat <(echo "hello world") Процесс замены

      Подстановка процессов поддерживается в системах, которые поддерживают именованные каналы (FIFO) или метод /dev/fd именования открытых файлов. Это принимает форму <(list) или же >(list), Список процессов запускается с его входом или выходом, подключенным к FIFO или некоторому файлу в /dev/fd, Имя этого файла передается в качестве аргумента текущей команде в результате расширения. Если >(list) Форма используется, запись в файл обеспечит ввод для списка. Если <(list) используется форма, файл, переданный в качестве аргумента, должен быть прочитан для получения вывода списка.

    • cat <<< $(echo "hello world") Здесь Строки

      Слово подвергается расширению скобок, расширению тильды, расширению параметров и переменных, подстановке команд, расширению арифметики и удалению кавычек. Расширение имени пути и разбиение по словам не выполняются. Результат передается команде в виде одной строки на ее стандартном вводе.

Рекомендации

  • man bash и искать перенаправление, конвейер, здесь строки и подстановка процесса
  • man cat только потому, что мы используем это...

Этот поток читает из файлов. > выходит в файл и < находится в файле. Демонстрация:

Первый echo "HELLO HELLO HELLO" > HELLO.txt а потом cat < HELLO.txt получает ваш вывод

 HELLO HELLO HELLO

Вроде бесполезно, поскольку вывод уже идет туда, куда вы хотите, но другой пример с тем же HELLO.txt cat < HELLO.txt >&1 явно направляющий catвывод на STDOUT.

Более полезно, иногда вы обнаруживаете, что вывод файлового дескриптора 2 (STDERR) перенаправляется такими командами, как

grep somepattern /path/to/a_bunch_of_files/* 2>&1 >> alloutput.txt

2>&1 Поток направляет ошибки на стандартный вывод. Затем все стандартные выходные данные передаются в alloutput.txt. Это поместит вывод ошибок в файл со стандартным выводом.

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