Их много.
Программы, вызывающие fork()
без exec()
, обычно следуют шаблону порождения дочерних рабочих процессов для выполнения различных задач в отдельных процессах по отношению к основному. Вы найдете это в таких разных программах, как dhclient
, php-fpm
и urxvtd
.
Программа, которая вызывает exec()
без fork()
, является цепной загрузкой , накладывая свой процесс на другой образ программы. Существует целая субкультура утилит загрузки по цепочке, которые выполняют определенные действия для обработки состояния, а затем выполняют другую программу для запуска с этим измененным состоянием процесса. Такие утилиты распространены в семействе daemontools наборов инструментов для обслуживания и управления системой, но не ограничиваются ими. Несколько примеров:
chpst
из рунита Геррита Пейпа s6-softlimit
иs6-envdir
из книги Лорана Берко s6local-reaper
иmove-to-control-group
из моего набора инструментов noshrdprio
и idprio
во FreeBSD numactl
для FreeBSD и Linux Наборы инструментов семейства daemontools содержат множество таких инструментов, отmachineenv
доfind-matching-jvm
и доruntool
.
Команда может быть переписана как
PASSING=0 FAILED=0 print "Test Started at `date`\n" >log_${ENV}
, так как перенаправление может произойти в любой точке командной строки.
Перенаправление отправляет вывод команды print
в файл с именемlog_${ENV}
(или log_$ENV
, фигурные скобки здесь ничего не сделают ), где ENV
предположительно является переменной оболочки с некоторым значение, существующее в текущей среде.
Два назначения для PASSING
и FAILED
установят эти две переменные в окружении команды print
. Они не будут существовать после выполнения этой строки (, если они не существовали ранее в сценарии, и в этом случае их исходные значения останутся неизменными после выполнения этой командной строки ).
Поскольку print
не похоже, что он использует эти две переменные (, если только это не скрипт, функция или что-то еще, о чем мы не знаем ), трудно сказать, каково намерение с помощью переменные.
Вещь print
принимает текстовую строку в качестве единственного аргумента, где часть строки представляет собой старую подстановку команд в стиле -, которая будет расширяться до вывода команды date
перед вызовом print
.. Используя более современный синтаксис подстановки команд,аргумент также может быть записан как "Test Started at $(date)\n"
.
Общий эффект будет возможно(в зависимости от того, что print
означает )запись заданной текстовой строки в определенный файл, имя которого зависит от значения $ENV
.
Связанные:
Вksh93
(и zsh
), print
это оболочка, построенная -в полезности, которая действует (грубо говоря )немного похоже на echo
. Эта оболочка также обрабатывает $ENV
особым образом, поскольку она будет источником файла, на который указывает $ENV
при запуске интерактивной оболочки. Использование его (или переменных верхнего -регистра вообще )в качестве универсальной переменной в сценарии оболочки не рекомендуется.
В связи с этим:
Вы должны "разобрать" (интерпретировать )командную строку (разделить на слова):
PASSING=0 FAILED=0 >log_${ENV} print "Test Started at `date`\n"
\___ __/ \__ __/ \___ ____/ \_ _/ \_________ ____________/
\/ \/ \/ \/ \/
var1 var2 redirect cmd "Argument to command".
Это пять слов (, разделенных пробелами ), которые составляют командную строку.
Переменная перед командой, как и в var=123 cmd
, будет определена в среде для (только )продолжительности выполнения команды. Затем он будет сброшен.
Некоторые переменные могут быть определены до имени команды.
Перенаправление используется для отправки вывода в файл или чтения ввода из файла.Перенаправление может появиться в любом месте командной строки и будет применяться ко всей командной строке (выполнение команды ).
В этом случае перенаправление заключается в выводе в файл, называемый конкатенацией слова log_
и значения внутри переменнойENV
(части $(ENV)
).
Очевидно, имя команды print
в данном случае.
Это имя команды существует (как встроенное )в ksh, mksh,lksh и zsh, но не в ash, dash, csh, yash, bash (и других ). В этих оболочках команда может существовать как внешняя программа, которую можно найти в PATH.
Аргумент (s )— это список параметров, текста или другой информации, которая передается команде и доступна в программах c как argv[]
и int argc
или в оболочке как $@
и $#
.
В этом случае аргумент включает одно расширение команды `date`
, эквивалентное (в современном синтаксисе и настоятельно рекомендуемое)$(date)
. Эта часть выполнит команду (, в данном случае )date
, и заменит всю часть выводом команды. Короче говоря, :поместит фактическую дату в это место.
Вся команда также может быть записана (с тем же эффектом ), что и:
PASSING=0 FAILED=0 print "Test Started at `date`\n" >log_${ENV}
Что, не имея достаточно информации, похоже, печатает одну строку в лог-файл. Если это действительно встроенный -в печати, упомянутый выше, две переменные не будут иметь никакого эффекта и могут быть стерты, чтобы записать команду как:
print "Test Started at `date`\n" >log_${ENV}
Но это всего лишь обоснованное предположение, чтобы на самом деле знать, что делает команда печати, вам нужно копнуть немного глубже. Вам нужно указать, в какой оболочке выполняется команда, и (, если она действительна для вашей оболочки ), вывод type print
.