В чем разница между cat 1 <2 3 и cat <1 2 3

Есть три файла – 1, 2 и 3.

В файле 1 – hello, в файле 2 - lovely, 3 - world

Команда 1

cat 1 <2 3

выводит

Hello
World

Куда девается содержимое файла 2?

Команда 2

cat <1 2 3

выводит

lovely
world

Куда девается содержимое файла 1?


Ответы (1 шт):

Автор решения: aleksandr barakin

ещё интереснее:

$ cat <2
lovely

что при этом происходит? оболочка создаёт новый процесс, загружает в него исполняемый блоб /bin/cat (ну или где он в вашей системе находится), и в качестве stdin этому процессу передаёт дескриптор открытого (оболочкой) файла с именем 2.

с точки зрения запущенного процесса cat ему не передано ни одного аргумента. его действия в этом случае (см. $ man cat):

With no FILE, or when FILE is -, read standard input.

вольный перевод:

если среди аргументов не указано имён файлов, или если аргумент равен -, читать из stdin.

вот и получается, что процесс cat прочитает stdin (фактически — содержимое файла с именем 2) и выдаст его в свой stdout.

но стоит добавить хотя бы ещё один аргумент:

$ cat <2 1
hello

процесс cat (самостоятельно) прочитает только содержимое файла с именем 1 (и выдаст его в свой stdout), а заботливо переданный для него оболочкой stdin просто проигнорирует.


а чтобы не проигнорировал, можно явно добавить аргумент -:

$ cat <2 1 -
hello
lovely

процесс cat «увидит» два аргумента: 1 и -, и выдаст в свой stdout сначала содержимое файла с именем 1, а затем то, что прочтёт из stdin (куда оболочка передаёт ему содержимое файла с именем 2).


доп. чтение:

→ Ссылка