Перенаправление трубы и стандартного ввода на кошку
Почему
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. Это поместит вывод ошибок в файл со стандартным выводом.