В большинстве систем вы можете перенаправить стандартный ввод / вывод / ошибку на другие файловые дескрипторы или места.
Например (в Unix):
./appname > output
Перенаправляет стандартный вывод из appname в файл с именем output.
./appname 2> errors > output
Перенаправляет stdout
в файл с именем output, а все ошибки из stderr
в файл с именем error.
В системах Unix вы также можете иметь программу, открывающую дескриптор файла и указывающую на stdin
, например:
echo "input" > input
cat input | ./appname
Это приведет к чтению программы из канала для stdin
.
Вот как в Unix вы можете "соединить" различные утилиты для создания одного более крупного инструмента.
find . -type f | ./appname | grep -iv "search"
Это запустит команду find
, возьмет ее вывод и передаст ее в ./appname, затем вывод appname
будет отправлен на ввод grep
, который затем ищет слово «поиск» , отображая только результаты, которые соответствуют.
Позволяет многим небольшим утилитам иметь очень мощный эффект.
Подумайте о >
, <
и |
как сантехника.
>
похоже на сток в приемнике, он принимает данные и сохраняет их там, где вы хотите их разместить. Когда оболочка встречает >
, она открывает файл.
> file
Когда оболочка увидит вышесказанное, она open
будет использовать файл, используя стандартный системный вызов, и запомнит этот дескриптор файла. В приведенном выше случае, поскольку нет ввода, он создаст пустой файл и позволит вам вводить больше команд.
banner Hello
Эта команда пишет Hello в консоли большими буквами и заставляет ее прокручиваться (здесь я использую Unix, так как это то, что я знаю лучше всего). Вывод просто записывается в стандартный вывод. Используя «сток» (>
), мы можем контролировать направление вывода, поэтому
banner Hello > bannerout
приведет к тому, что все данные из стандартного вывода баннера будут перенаправлены в дескриптор файла, открытый оболочкой, и, таким образом, будут записаны в файл с именем bannerout
.
Трубы работают аналогично >
в том, что они помогают контролировать поток данных. Однако каналы не могут записывать в файлы и могут использоваться только для того, чтобы поток данных переходил из одной точки в другую.
Например, вот вода, протекающая через несколько подстанций и очищающая отходы:
pump --from lake | treatment --cleanse-water | pump | reservoir | pump > glass
Вода течет из озера через трубу на водоочистную станцию, от установки обратно в насос, который перемещает ее в резервуар, затем снова закачивается в муниципальные водопроводные трубы и через вашу раковину в вашу стакан.
Обратите внимание, что трубы просто соединяют все выходы вместе, в конечном итоге это заканчивается в вашем стекле.
То же самое происходит с командами и их обработкой в оболочке в Linux. Также следует путь к конечному результату.
Теперь есть одна заключительная вещь, которую я еще не обсуждал в моих предыдущих высказываниях, это <
символ ввода. Что он делает, так это читает из файла и выводит его на стандартный ввод программ.
cat < bannerout
Просто распечатает то, что было сохранено в баннере. Это можно использовать, если у вас есть файл, который вы хотите обработать, но не хотите добавлять cat <file>
из-за нежелания выполнять дополнительную команду в цепочке.
Так попробуйте это:
echo "Hello" > bannerinput
banner < bannerinput
Сначала будет помещена строка «Hello» в файл bannerinput
, а затем, когда ваш баннер запуска будет прочитан из файла bannerinput
.
Надеюсь, что это поможет вам понять, как перенаправление и отправка работает в Unix (некоторые, если не большинство, также применимы к Windows).