В вычислениях подстановка процессов — это форма межпроцессного взаимодействия , которая позволяет вводу или выводу команды отображаться в виде файла. Команда заменяется в строке, где обычно встречается имя файла, командной оболочкой . Это позволяет программам, которые обычно принимают только файлы, напрямую читать или записывать в другую программу.
Подстановка процесса была доступна как опция времени компиляции для ksh88
версии KornShell 1988 года от Bell Labs . [1] Оболочка rc предоставляет функцию «конвейерного ветвления» в версии 10 Unix , выпущенной в 1990 году. [2] Оболочка Bash обеспечивала подстановку процессов не позднее версии 1.14, выпущенной в 1994 году. [3]
Команда Unix diff обычно принимает имена двух файлов для сравнения или одно имя файла и стандартный ввод. Подстановка процесса позволяет напрямую сравнивать вывод двух программ:
Подстановку процесса также можно использовать для захвата выходных данных, которые обычно направляются в файл, и перенаправления их на входные данные процесса. Синтаксис Bash для записи в процесс — >(command)
. Вот пример использования команд tee
, wc
и gzip
, которые подсчитывают строки в файле wc -l
и сжимают его gzip
за один проход:
Под капотом процесс замены имеет две реализации. В системах, которые поддерживают /dev/fd
(большинство Unix-подобных систем), он работает, вызывая pipe()
системный вызов, который возвращает дескриптор файла $fd
для нового анонимного канала, затем создает строку /dev/fd/$fd
и заменяет ее в командной строке. В системах без /dev/fd
поддержки он вызывает mkfifo
новое временное имя файла для создания именованного канала и заменяет это имя файла в командной строке. Чтобы проиллюстрировать необходимые шаги, рассмотрим следующую простую подстановку команд в системе с /dev/fd
поддержкой:
Для именованных каналов выполнение отличается только созданием и удалением канала; они создаются с помощью mkfifo
(которому дается новое имя временного файла) и удаляются с помощью unlink
. Все остальные аспекты остаются прежними.