Что делает эта команда (странные назначения и перенаправления)

Их много.

Программы, вызывающие fork()без exec(), обычно следуют шаблону порождения дочерних рабочих процессов для выполнения различных задач в отдельных процессах по отношению к основному. Вы найдете это в таких разных программах, как dhclient, php-fpmи urxvtd.

Программа, которая вызывает exec()без fork(), является цепной загрузкой , накладывая свой процесс на другой образ программы. Существует целая субкультура утилит загрузки по цепочке, которые выполняют определенные действия для обработки состояния, а затем выполняют другую программу для запуска с этим измененным состоянием процесса. Такие утилиты распространены в семействе daemontools наборов инструментов для обслуживания и управления системой, но не ограничиваются ими. Несколько примеров:

Наборы инструментов семейства daemontools содержат множество таких инструментов, отmachineenvдоfind-matching-jvmи доruntool.

-1
10.10.2018, 16:36
2 ответа

Команда может быть переписана как

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.

Связанные:


Вksh93zsh), printэто оболочка, построенная -в полезности, которая действует (грубо говоря )немного похоже на echo. Эта оболочка также обрабатывает $ENVособым образом, поскольку она будет источником файла, на который указывает $ENVпри запуске интерактивной оболочки. Использование его (или переменных верхнего -регистра вообще )в качестве универсальной переменной в сценарии оболочки не рекомендуется.

В связи с этим:

6
28.04.2021, 23:41

Вы должны "разобрать" (интерпретировать )командную строку (разделить на слова):

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.

0
28.04.2021, 23:41

Теги

Похожие вопросы