input.txt> grep foo
Вероятно, это ошибка. Он запускает команду input.txt
и перенаправляет вывод в файл с именем grep
. foo
является аргументом команды input.txt
.
grep foo
foo
во входных данных, поступающих из input.txt
. grep
не получает имя файла в командной строке, поэтому вместо этого он будет работать со стандартным вводом. Оболочка посредством перенаправления гарантирует, что содержимое файла введено.txt
доставляется в стандартный поток ввода для grep
.
cat input.txt | grep foo
Это похоже на предыдущее, но стандартный поток ввода grep
теперь подключен к каналу, через который команда cat
доставляет содержимое файла ] input.txt
. Команда cat
записывает в свой стандартный выходной поток, который соединен каналом со стандартным входным потоком grep
.
grep foo input.txt
Это заставляет grep
открывать файл input.txt
и искать в нем строку foo
. Он не использует стандартный поток ввода.
В общем:
Канал ( |
) соединяет стандартный поток вывода левой стороны со стандартным потоком ввода правой стороны.
Перенаправление ввода ( <
) перенаправляет из файла в стандартный поток ввода.
Перенаправление вывода (>
) перенаправляет стандартный вывод в файл.
Входные и выходные потоки могут быть перенаправлены одновременно, например используя commandname
, и команда может как читать, так и писать в конвейер, как вторая команда в command1 | command2 | command3
.
Перенаправление и конвейер могут быть объединены: cat
.
Многие утилиты Unix принимают входное имя файла в качестве необязательного аргумента и будут использовать стандартный ввод, если имя файла не было задано.
Некоторые утилиты Unix только работают со стандартным вводом, например, tr
.
Bash и некоторые другие оболочки, такие как ksh
, также поддерживают перенаправление со строки на стандартный ввод с использованием <<< "строка"
(называемая здесь-строка ), и большинство командных интерпретаторов понимают здесь-документы (посмотрите их).