Оператор перенаправления в UNIX - PullRequest
1 голос
/ 04 декабря 2010

Предположим, у меня есть три файла file1 file2 file3, имеющие некоторое содержимое Теперь, когда я делаю это в командной строке cat file1 > file2 >file3

Содержимое файла1 копируется в файл3, и файл2 становится пустым

Точно так же, когда я делаю cat > file1 > file2 > file3 Он запрашивает ввод, и этот ввод хранится в файле3, и оба файла1 и файл2 пусты

, а также для cat > file1 > file2 < file3 содержимое файла3 копируется в файл2, а файл1 пуст.

Может кто-нибудь объяснить мне, что происходит, я новичок в UNIX. Также любой веб-сайт, где я могу узнать больше об этих операторах перенаправления.

Спасибо

Ответы [ 3 ]

8 голосов
/ 04 декабря 2010

Рассмотрим, как оболочка обрабатывает каждую часть команды при ее разборе:

cat file1 > file2 >file3
  1. cat file1: подготовить новый процесс с образом программы cat с аргументом file1,(учитывая 1 или более аргументов, cat будет читать из каждого аргумента как файл и записывать в дескриптор его выходного файла)
  2. > file2: изменить дескриптор выходного файла нового процесса, чтобы записать в file2вместо текущего приемника (изначально это была консоль для интерактивной оболочки) - создайте файл `file2, если необходимо.
  3. > file3: измените дескриптор выходного файла нового процесса, чтобы записать в file3 вместо текущеговыходной приемник (был file2) - при необходимости создайте file3
  4. End of command: порождайте новый процесс

Таким образом, в конце создается file2, нонеиспользованными.file3 получает данные.

cat > file1 > file2 > file3
  1. cat: подготовьте новый процесс с программой / изображением cat без аргументов.(без аргументов cat будет читать из своего дескриптора входного файла и записывать в свой дескриптор выходного файла)
  2. > file1: изменить дескриптор выходного файла нового процесса, чтобы записать в file1 вместотекущий выходной приемник (изначально консоль для интерактивной оболочки) - при необходимости создайте file1.
  3. > file2: измените дескриптор выходного файла нового процесса, чтобы записать в file2 вместо текущего выходного приемника(было file1) - при необходимости создайте file2.
  4. > file3: измените дескриптор выходного файла нового процесса, чтобы записать в file3 вместо текущего приемника - (было file2) создать file3 при необходимости
  5. End of command: создать новый процесс

Таким образом, в итоге file1 и file2 создаются, но не используются.file3 получает данные.cat ожидает ввода на своем устройстве ввода (консольное устройство по умолчанию для интерактивной оболочки).Любой входной сигнал, который получает cat, поступит в его выходное устройство (которое в итоге будет file3 к тому времени, когда оболочка закончит обработку команды и вызовет cat).

cat > file1 > file2 < file3
  1. cat: подготовить новый процесс с программой / образом cat без аргументов.(без аргументов cat будет читать из своего дескриптора входного файла и записывать в свой дескриптор выходного файла)
  2. > file1: изменить дескриптор выходного файла нового процесса, чтобы записать в file1 вместотекущий выходной приемник (изначально консоль для интерактивной оболочки) - при необходимости создайте file1.
  3. > file2: измените дескриптор выходного файла нового процесса, чтобы записать в file2 вместо текущего выходного приемника(был file1) - при необходимости создайте file2.
  4. < file3: измените дескриптор входного файла нового процесса на чтение из file3 вместо текущего источника ввода (изначально консоль дляинтерактивная оболочка)
  5. 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

1 голос
/ 04 декабря 2010

Если вы не хотите потерять оригинальный контент, вам следует вместо этого использовать redirect и добавлять операторы >> или <<. Вы можете прочитать больше здесь .

1 голос
/ 04 декабря 2010

Вы можете перенаправить стандартный ввод < стандартный вывод 1> или > ошибка вывода 2> или оба выхода &>, но вы можете перенаправить только 1: 1, вы не можете перенаправить один выход на два разные файлы.

Вам нужна утилита tee.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...