В чем разница между 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 шт):
ещё интереснее:
$ 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).
доп. чтение:
$ man cat- про перенаправление ввода-вывода в стандарте posix