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