Для некоторых команд можно указать определенный ввод в качестве стандартного аргумента или аргумента командной строки.
В частности, предположим, что command
в качестве аргумента командной строки можно использовать ввод stdin и имя файла command < myfile
, cat myfile | command
а также command myfile
может выдавать один и тот же результат.
Например,
Когда команда sed
:
sed s/day/night/ <myfile >new
sed s/day/night/ myfile >new
cat myfile | sed s/day/night/ >new
Когда команда cat
:
cat < myfile
cat myfile
- Мне было интересно, есть ли какие-то общие правила в отношении их исполнения, то есть, какое из них обычно наиболее эффективно, а какое наименее?
- Перенаправление всегда лучше, чем труба?
Ответы:
cat file | command
Синтаксис считается Ненужное использованиеCat
. Из всех ваших вариантов, он требует снижения производительности, потому что он должен порождать другой процесс в ядре. Каким бы незначительным это ни оказалось в общей картине, это накладные расходы, которых нет у других форм. Это было рассмотрено на такие вопросы, как: Должен ли я заботиться о ненужных кошек?Между двумя другими формами практически нет различий в производительности. STDIN - это специальный файловый узел, который процесс должен открывать и читать, как и любой другой. Передача имени файла вместо STDIN просто делает его открытым другим файлом.
Разница будет в том, какие функции / гибкость вы ищете.
sed -i
для редактирования на месте. (Примечание: поскольку для этого необходимо создать новый файл за кулисами, это не выигрыш в производительности по сравнению с другими перенаправлениями, но это удобный шаг.)sed [exp] < file1 file2
или дажеsed [exp] < <(grep command)
. Подробности этого варианта использования можно найти по этому вопросу: Замена процесса и каналисточник
sed [exp] < <(grep command)
будет работать так же хорошо, какsed [exp] <(grep command)
(поскольку<(grep command)
создает именованный временный файл для длины команды, которыйsed
вполне может открываться самостоятельно без помощи оболочки).Учитывая, что
command file
просто открывает файл и с тех пор работает, как будто это былоstdin
, есть небольшая разница. С перенаправлением оболочки вы просто открываете файл заранее (shell делает,), а не сам бинарный файл команды.Если мы говорим о
cat file | command
противcommand <file
, то последний предпочтительнее. Вы не заметите значительной разницы в производительности между ними, но первая излишне сложна (дополнительный процесс и буфер общей памяти для канала, с ограниченной пропускной способностью.) Кроме того, вы не можетеseek
(произвольно изменить позицию указателя файла) в труба, а можно в обычном файле. Некоторые команды могут использовать более эффективный алгоритм, еслиseek
возможен ввод во входном файле.источник
<file
? Ваша точка зрения действительна для использования имени входного файла, чтобы получить жесткое имя выходного файла, например:gzip file
производитfile.gz
.close
sstdin
и вызовыdup
на открытом дескрипторе файла, так что заменить старыйstdin
(который был своего рода TTY в большинстве случаев). С точки фильма игрока зрения нет никакой разницы между тем , что и при открытии файла по его имени в Сам игрок. Файловый дескриптор доступен для поиска в обоих сценариях, поэтому, когда мы пропускаем до конца, различий, обнаруживаемых пользователем, нет.