Замена процесса
В вычислениях подстановка процессов — это форма межпроцессного взаимодействия , которая позволяет отображать ввод или вывод команды в виде файла. Команда заменяется в строке вместо имени файла командной оболочкой . Это позволяет программам, которые обычно принимают файлы только для прямого чтения или записи в другую программу.
История
[ редактировать ]Замена процесса была доступна как опция времени компиляции для ksh88
, версия KornShell 1988 года от Bell Labs . [1] Оболочка rc предоставляет такую возможность как «ветвление конвейера» в версии 10 Unix , выпущенной в 1990 году. [2] Оболочка Bash обеспечивала замену процессов не позднее версии 1.14, выпущенной в 1994 году. [3]
Пример
[ редактировать ]В следующих примерах используется синтаксис KornShell.
Команда Unix diff обычно принимает для сравнения имена двух файлов или одно имя файла и стандартный ввод. Подстановка процессов позволяет напрямую сравнивать выходные данные двух программ:
$ diff <(sort file1) <(sort file2)
The <(command)
Выражение сообщает интерпретатору команд о необходимости запуска команды и отображения ее вывода в виде файла. Команда может быть любой произвольно сложной командой оболочки.
Без замены процесса альтернативами являются:
- Сохраните вывод команды(ов) во временный файл, затем прочитайте временные файлы.
$ sort file2 > /tmp/file2.sorted $ sort file1 | diff - /tmp/file2.sorted $ rm /tmp/file2.sorted
- Создайте именованный канал (также известный как FIFO ), запустите одну команду, записывающую данные в именованный канал в фоновом режиме, затем запустите другую команду с именованным каналом в качестве входных данных.
$ mkfifo /tmp/sort2.fifo $ sort file2 > /tmp/sort2.fifo & $ sort file1 | diff - /tmp/sort2.fifo $ rm /tmp/sort2.fifo
Оба варианта более громоздки.
Подстановку процессов также можно использовать для захвата вывода, который обычно поступает в файл, и перенаправления его на вход процесса. Синтаксис Bash для записи в процесс: >(command)
. Вот пример использования tee
, wc
и gzip
команды, которые подсчитывают строки в файле с помощью wc -l
и сжимает его с помощью gzip
за один проход:
$ tee >(wc -l >&2) < bigfile | gzip > bigfile.gz
Преимущества
[ редактировать ]Основными преимуществами замены процесса перед его альтернативами являются:
- Простота : команды можно задавать в строке; нет необходимости сначала сохранять временные файлы или создавать именованные каналы.
- Производительность : Чтение непосредственно из другого процесса часто происходит быстрее, чем запись временного файла на диск, а затем его чтение обратно. Это также экономит дисковое пространство.
- Параллелизм : заменяемый процесс может выполняться одновременно с командой, считывающей ее выходные данные или записывающей ее входные данные, используя преимущества многопроцессорной обработки для сокращения общего времени вычислений.
Механизм
[ редактировать ]Подмена процесса имеет две реализации. В системах, поддерживающих /dev/fd
(большинство Unix-подобных систем) он работает, вызывая pipe()
системный вызов, который возвращает дескриптор файла $fd
для нового анонимного канала, а затем создаем строку /dev/fd/$fd
и подставляет его в командной строке. В системах без /dev/fd
поддержка, он звонит mkfifo
с новым временным именем файла для создания именованного канала и подставляет это имя файла в командной строке. Чтобы проиллюстрировать необходимые шаги, рассмотрим следующую простую замену команд в системе с /dev/fd
поддерживать:
$ diff file1 <(sort file2)
Шаги, которые выполняет оболочка:
- Создайте новый анонимный канал. Эта труба будет доступна с помощью чего-то вроде
/dev/fd/63
; вы можете увидеть это с помощью команды типаecho <(true)
. - Выполните замененную команду в фоновом режиме (
sort file2
в данном случае), направляя его вывод в анонимный канал. - Выполните основную команду, заменив замененную команду путем анонимного канала. В этом случае полная команда может расшириться до чего-то вроде
diff file1 /dev/fd/63
. - Когда выполнение завершится, закройте анонимный канал.
Для именованных каналов выполнение отличается только созданием и удалением канала; они созданы с mkfifo
(которому присвоено новое имя временного файла) и удален с помощью unlink
. Все остальные аспекты остаются прежними.
Ограничения
[ редактировать ]Созданные «файлы» недоступны для поиска , что означает, что процесс чтения или записи в файл не может выполнять произвольный доступ ; он должен прочитать или записать один раз от начала до конца. Программы, которые явно проверяют тип файла перед его открытием, могут отказаться работать с подстановкой процесса, поскольку «файл», полученный в результате подмены процесса, не является обычным файлом . Кроме того, до версии Bash 4.4 (выпущенной в сентябре 2016 г.) не было возможности получить код завершения команды замены процесса из оболочки, создавшей замену процесса. [4]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Розенблатт, Билл; Роббинс, Арнольд (апрель 2002 г.). «Приложение А.2». Изучение Korn Shell (2-е изд.). О'Рейли и партнеры. ISBN 0-596-00195-9 .
- ^ Дафф, Том (1990). Rc — оболочка для систем Plan 9 и UNIX . CiteSeerX 10.1.1.41.3287 .
- ^ Рэми, Чет (18 августа 1994 г.). Примечания к выпуску Bash 1.14 . Фонд свободного программного обеспечения. Доступен в исходном архиве Gnu версии 1.14.7 по состоянию на 12 февраля 2016 г.
- ^ «Замена процесса» . Вики Грега . 22 сентября 2016 г. Проверено 6 февраля 2021 г.
Дальнейшее чтение
[ редактировать ]- «Справочное руководство по Bash» . Проект GNU . Фонд свободного программного обеспечения. 23 декабря 2009 года . Проверено 1 октября 2011 г.
- Купер, Мендель (30 августа 2011 г.). «Расширенное руководство по написанию сценариев Bash» . Проект документации Linux . Проверено 1 октября 2011 г.
- Фрейзер, Митч (22 мая 2008 г.). «Подмена процесса Bash» . Linux-журнал . Проверено 1 октября 2011 г.