Рассмотрим, как оболочка обрабатывает каждую часть команды при ее разборе:
cat file1 > file2 >file3
cat file1
: подготовить новый процесс с образом программы cat
с аргументом file1
,(учитывая 1 или более аргументов, cat
будет читать из каждого аргумента как файл и записывать в дескриптор его выходного файла) > file2
: изменить дескриптор выходного файла нового процесса, чтобы записать в file2
вместо текущего приемника (изначально это была консоль для интерактивной оболочки) - создайте файл `file2, если необходимо. > file3
: измените дескриптор выходного файла нового процесса, чтобы записать в file3
вместо текущеговыходной приемник (был file2
) - при необходимости создайте file3
End of command
: порождайте новый процесс
Таким образом, в конце создается file2
, нонеиспользованными.file3
получает данные.
cat > file1 > file2 > file3
cat
: подготовьте новый процесс с программой / изображением cat
без аргументов.(без аргументов cat
будет читать из своего дескриптора входного файла и записывать в свой дескриптор выходного файла) > file1
: изменить дескриптор выходного файла нового процесса, чтобы записать в file1
вместотекущий выходной приемник (изначально консоль для интерактивной оболочки) - при необходимости создайте file1
. > file2
: измените дескриптор выходного файла нового процесса, чтобы записать в file2
вместо текущего выходного приемника(было file1
) - при необходимости создайте file2
. > file3
: измените дескриптор выходного файла нового процесса, чтобы записать в file3
вместо текущего приемника - (было file2
) создать file3
при необходимости End of command
: создать новый процесс
Таким образом, в итоге file1
и file2
создаются, но не используются.file3
получает данные.cat
ожидает ввода на своем устройстве ввода (консольное устройство по умолчанию для интерактивной оболочки).Любой входной сигнал, который получает cat
, поступит в его выходное устройство (которое в итоге будет file3
к тому времени, когда оболочка закончит обработку команды и вызовет cat
).
cat > file1 > file2 < file3
cat
: подготовить новый процесс с программой / образом cat
без аргументов.(без аргументов cat
будет читать из своего дескриптора входного файла и записывать в свой дескриптор выходного файла) > file1
: изменить дескриптор выходного файла нового процесса, чтобы записать в file1
вместотекущий выходной приемник (изначально консоль для интерактивной оболочки) - при необходимости создайте file1
. > file2
: измените дескриптор выходного файла нового процесса, чтобы записать в file2
вместо текущего выходного приемника(был file1
) - при необходимости создайте file2
. < file3
: измените дескриптор входного файла нового процесса на чтение из file3
вместо текущего источника ввода (изначально консоль дляинтерактивная оболочка) End of command
: порождает новый процесс
Таким образом, в итоге file1
создается, но не используется.file2
получает данные.cat
ожидает ввода на своем устройстве ввода (которое установлено на file3
к тому времени, когда оболочка завершила обработку команды и вызвала cat
).Любые входные данные, которые получает cat
, поступают на его выходное устройство (которое заканчивается на file2
к тому времени, когда оболочка закончит обработку команды и вызовет cat
).
-
Обратите внимание, что в первом примере cat
- это тот, кто обрабатывает / открывает file1
.Оболочка просто передала слово file1
программе в качестве аргумента.Однако оболочка открыта / создана file2
и file3
.cat
ничего не знал о file3
и понятия не имел, куда идет материал, который он записывал на стандартный вывод.
В двух других примерах оболочка открывала все файлы.cat
ничего не знал ни о каких файлах.cat
понятия не имел, откуда поступает его стандартный ввод и куда направляется его стандартный вывод.
В комментарии @Sorpigal - руководство BASH содержит несколько хороших описаний того, что делают различные операторы перенаправления. Многое из этого одинаково для разных оболочек Unix в разной степени, но для подтверждения обратитесь к своему конкретному руководству / справочной странице по оболочке. Спасибо @ Сорпигал.
http://gnu.org/software/bash/manual/html_node/Redirections.html