Перенаправление с |
или <
контролирует что содержит поток stdin ;это не влияет на список аргументов командной строки программы.
Таким образом, more <a.txt
(эффективно) или cat a.txt | more
(неэффективно) оба прикрепляют дескриптор файла, из которого можно прочитать содержимое a.txt
вдескриптор файла stdin нового процесса перед заменой этого процесса на more
. Точно так же echo a.txt | more
делает a.txt
сам буквальный текст , который more
читает из его потока stdin, , который является местом по умолчанию, в котором задокументировано получение входных данных для отображения, если не заданолюбые более конкретные имена файлов в командной строке .
Как правило, если у вас есть список имен файлов и вы хотите преобразовать их в аргументы командной строки, это то, что xargs
для (хотя использование его без особой тщательности может привести к ошибкам, потенциально влияющим на безопасность).
Рассмотрим следующее, которое (использование NUL вместо разделителей новой строки для разделения имен файлов) является безопасным использованиемиз xargs
, чтобы взять список имен файлов, передаваемых по нему, и преобразовать его в список аргументов в cat
, используемый для объединения всех этих файлов вместе и генерирования одного потока ввода в more
:
printf '%s\0' a.txt b.txt |
xargs -0 cat -- |
more