Как задаются и выполняются простые и сложные команды Linux

Обновлено: 21.11.2024

В Unix-подобных операционных системах команды at, batch, atq и atrm могут запланировать выполнение команды или команд в указанное время в будущем.

На этой странице рассматриваются версии GNU/Linux at, batch, atq и atrm.

Описание

Команда at назначает запуск команды один раз в определенное время, когда у вас обычно есть разрешение на запуск. Команда at может быть чем угодно: от простого сообщения-напоминания до сложного сценария. Вы начинаете с запуска команды at в командной строке, передавая ей запланированное время в качестве опции. Затем он помещает вас в специальную подсказку, где вы можете ввести команду (или серию команд) для запуска в запланированное время. Когда вы закончите, нажмите Control-D в новой строке, и ваша команда будет помещена в очередь.

Типичная последовательность команд at выглядит следующим образом (команды, которые вы вводите, показаны здесь в синем поле или выделены полужирным шрифтом ниже):

Когда мы запустили команду, первое, что мы сделали, это выдали нам «предупреждение», сообщающее нам, в какой командной оболочке выполняются наши команды: /bin/sh, Bourne Shell. Эта оболочка является традиционной стандартной оболочкой Unix.

Затем он помещает нас в командную строку at>. Здесь мы набираем простую команду echo, которая выводит строку текста. Мы нажимаем Enter и попадаем в новую подсказку at>. Затем мы нажимаем Control-D, говоря, что мы закончили с нашими командами. Затем он сообщает нам, что наша работа — работа номер 1, и она будет запущена в следующий вторник.

Выходные данные указанной вами команды будут отправлены вам по почте. Вы можете прочитать эту почту с помощью почтовой программы или такой программы, как pine (или современная версия pine, называемая alpine). Вы можете скачать эти программы, если у вас их нет, или установить их с помощью менеджера пакетов. Например, в Ubuntu, где используется система управления пакетами APT, вы можете установить их с помощью команды apt-get, а именно: sudo apt-get install mail или sudo apt-get install alpine.

Указание времени

at использует очень случайное представление времени и даты. Он даже знает некоторые "обычно используемые" времена, которые вы, возможно, не ожидаете — например, он знает, что "время чаепития" традиционно приходится на 16:00.

Вот примеры времени, в которое можно перейти в at, чтобы запланировать выполнение команды. Например, предположим, что текущее время — 10:00 утра, вторник, 18 октября 2014 г. Следующие выражения будут переведены в следующее время:

< tr > < td>10:00 25 октября 2014 г.< td>сейчас + 1 час
выражение: переводится как:
полдень 12:00 18 октября 2014 г.
полночь 12:00 19 октября 2014 г.
время чая 16:00, 18 октября 2014 г.
завтра 10:00, 19 октября 2014 г.< /td>
завтра полдень 12:00 19 октября 2014 г.
следующая неделя
следующий понедельник 10:00 24 октября 2014 г.
пт 10:00, 21 октября 2014 г.
НОЯБРЬ 10:00, 18 ноября 2014 г.
9:00 9:00, 19 октября 2014 г.
14:30 14:30, 18 октября 2014 г.
14:30 14:30, 18 октября 2014 г.
14:30 завтра 14:30 19 октября 2014 г.
14:30 в следующем месяце 18:30 18 ноября 2014 г.
14:30 Пт ri 14:30, 21 октября 2014 г.
14:30, 21 октября 14:30, 21 октября 2014 г.
14:30, 21 октября 14:30, 21 октября 2014 г.
2: 30 PM 21.10.2014 14:30 21 октября 2014
14:30 21.10.14 2 :30 PM, 21 октября 2014 г.
сейчас + 30 минут 10:30 18 октября 2014 г.
11:00 18 октября 2014 г.
сейчас + 2 дня 10:00 октября 20 2014
16:00 + 2 дня 16:00 20 октября 2014 г.
сейчас + 3 недели 10:00 8 ноября 2014 г.
сейчас + 4 месяца 10:00 18 февраля 2015 г.< /td>
сейчас + 5 лет 10:00 18 октября 2019 г.

Итак, если вы запустите команду:

Затем введите команду в приглашении at>, нажмите Enter и нажмите Control-D, и через десять лет вы получите по почте результаты вашей команды.

Если вы не укажете время в командной строке, at вернет следующее сообщение об ошибке:

Задание не добавлено в очередь. Поэтому всегда указывайте свое время в командной строке.

Использование atq для просмотра очереди at

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

Эта информация слева направо: номер задания, дата, час, год, очередь и имя пользователя.

Программа atq перечисляет только те задания, которые принадлежат вам — если вы не являетесь суперпользователем, где она перечисляет задания всех пользователей.Итак, чтобы вывести список всех заданий, которые в настоящее время находятся в очереди в системе, введите эту команду (если у вас есть права суперпользователя):

Введите пароль при появлении запроса.

Синтаксис

Техническое описание

at и команды пакетного чтения из стандартного ввода или указанного файла, которые должны быть выполнены позже, с помощью sh.

at выполняет команды в указанное время.

atq перечисляет незавершенные задания пользователя, если только пользователь не является суперпользователем; в этом случае перечислены все рабочие места. Формат выходных строк (по одной для каждого задания): номер задания, дата, час, год, очередь и имя пользователя.

atrm удаляет задания, идентифицируемые по номеру задания.

пакетное выполнение команд, когда позволяют уровни загрузки системы; другими словами, когда средняя нагрузка падает ниже 1,5 или значения, указанного при вызове atd.

At допускает довольно сложные спецификации времени, расширяя стандарт POSIX.2. Он принимает время в формате ЧЧ:ММ для запуска задания в определенное время дня. (Если это время уже прошло, предполагается, что это следующий день.) Вы также можете указать полночь, полдень или время чая (16:00), а также указать время суток с суффиксом AM или PM для бега по утрам или вечер. Вы также можете указать, в какой день выполняется задание, указав дату в форме месяц-название дня с необязательным годом или указав дату в форме ММДД[CC]ГГ, ММ/ДД/[CC]ГГ, ДД.ММ. .[CC]ГГ или [CC]ГГ-ММ-ДД. Спецификация даты должна следовать спецификации времени суток. Вы также можете указать время, например, сейчас + количество единиц времени, где единицы времени могут быть минутами, часами, днями или неделями, и вы можете указать at, чтобы запустить задание сегодня, добавив к времени суффикс сегодня, и запустить задание завтра, добавив к времени суффикс завтра.

Например, чтобы запустить задание в 16:00. через три дня вы бы сделали это в 16:00 + 3 дня, чтобы запустить задание в 10:00 31 июля, вы должны сделать это в 10:00 31 июля, а чтобы запустить задание в 1:00 завтра, вы должны сделать это в 1:00 завтра.< /p>

Определение спецификации времени находится в /usr/share/doc/at/timespec.

Как в at, так и в пакетном режиме команды считываются из стандартного ввода или из файла, указанного с помощью параметра -f, и выполняются. Рабочий каталог, среда (за исключением переменных BASH_VERSINFO, DISPLAY, EUID, GROUPS, SHELLOPTS, TERM, UID и _) и umask сохраняются с момента вызова.

Поскольку at в настоящее время реализован как программа setuid, другие переменные среды (например, LD_LIBRARY_PATH или LD_PRELOAD) также не экспортируются. Это может измениться в будущем. В качестве обходного пути задайте эти переменные явно в своем задании.

Команда at или пакетная команда, запущенная из оболочки su, сохранит текущий идентификатор пользователя. Пользователю отправляется стандартная ошибка и стандартный вывод команд, если они есть. Почта будет отправлена ​​с помощью команды /usr/sbin/sendmail. Если at выполняется из оболочки su, письмо получит владелец оболочки входа в систему.

Эти команды всегда может использовать суперпользователь. Для других пользователей разрешение на использование at определяется файлами /etc/at.allow и /etc/at.deny. Подробнее см. на странице .allow.

Параметры

-V Выводит номер версии в стандартную ошибку и успешно завершает работу.
-q queue Использует указанную очередь. Обозначение очереди состоит из одной буквы; Допустимые обозначения очередей находятся в диапазоне от a до z и от A до Z. Очередь a используется по умолчанию для at, а очередь b — для партии. Очереди с более высокими буквами выполняются с повышенной аккуратностью. Специальная очередь "=" зарезервирована для текущих заданий.

Файлы

/var/spool/cron/atjobs
/var/spool/cron/atspool
/proc/loadavg
/var/run/utmp
/etc/at. разрешить
/etc/at.deny

Примеры

Выполните команды, перечисленные в файле my-at-jobs.txt, в 1:35. Все выходные данные задания отправляются пользователю, выполняющему задание. При успешном вводе этой команды вы получите приглашение, подобное приведенному ниже примеру:

Эта команда выводит список всех запланированных заданий в следующем формате:

<р>. это то же самое, что и запуск команды atq.

Удаляет задание 1. Эта команда аналогична запуску команды atrm 1.

Удаляет задание 23. Эта команда аналогична запуску команды с -r 23.

Связанные команды

crontab — просмотр и редактирование списка заданий, которые система будет запускать через равные промежутки времени.

Выполняет КОМАНДУ над каждым файлом, который находит совпадения. Последовательность команд заканчивается ; (символ ";" экранирован, чтобы убедиться, что оболочка передает его для поиска буквально, не интерпретируя его как специальный символ).

bash$ find ~/ -name '*.txt' /home/bozo/.kde/share/apps/karm/karmdata.txt /home/bozo/misc/irmeyc.txt /home/bozo/test-scripts /1.txt

Если COMMAND содержит <> , find заменяет "<>" полным путем к выбранному файлу .

Опцию -exec для поиска не следует путать со встроенной оболочкой exec.

Пример 16-3.Плохое имя, удалить имена файлов в текущем каталоге, содержащие недопустимые символы и пробелы.

Пример 16-4. Удаление файла по номеру инода

Команда find также работает без параметра -exec.

Фильтр для подачи аргументов в команду, а также инструмент для сборки самих команд. Он разбивает поток данных на достаточно маленькие фрагменты для обработки фильтрами и командами. Рассматривайте его как мощную замену обратным кавычкам. В ситуациях, когда подстановка команд завершается ошибкой со слишком большим количеством аргументов, часто работает подстановка xargs. [1] Обычно xargs читает из стандартного ввода или из конвейера, но ему также может быть предоставлен вывод файла.

bash$ ls -l total 0 -rw-rw-r-- 1 bozo bozo 0 29 января 23:58 file1 -rw-rw-r-- 1 bozo bozo 0 29 января 23:58 file2 bash$ ls - л | xargs total 0 -rw-rw-r-- 1 bozo bozo 0 29 января 23:58 file1 -rw-rw-r-- 1 bozo bozo 0 янв. bash$ find ~/mail -type f | xargs grep "Linux" ./misc:User-Agent: slrn/0.9.8.1 (Linux) ./sent-mail-jul-2005: размещено проектом документации Linux. ./sent-mail-jul-2005: (Сайт проекта документации Linux, версия в формате rtf) ./sent-mail-jul-2005: Тема: Критика статьи Бозо о Windows/Linux ./sent-mail-jul-2005: при упоминании что файловая система Linux ext2/ext3. . .

Обратите внимание, что xargs обрабатывает переданные ему аргументы последовательно, по одному за раз.

bash$ найти /usr/bin | файл xargs /usr/bin: каталог /usr/bin/foomatic-ppd-options: исполняемый текст сценария Perl. . .

Интересным параметром xargs является -n NN , который ограничивает число передаваемых аргументов значением NN.

лс | xargs -n 8 echo перечисляет файлы в текущем каталоге в 8 столбцах.

Другой полезный параметр — -0 в сочетании с find -print0 или grep -lZ . Это позволяет обрабатывать аргументы, содержащие пробелы или кавычки.

найти / -введите f -print0 | xargs -0 grep -liwZ GUI | xargs -0 пм -f

grep -rliwZ GUI / | xargs -0 пм -f

Любой из вышеперечисленных способов удалит любой файл, содержащий "GUI" . (Спасибо, С.К.)

Опция -P для xargs разрешает параллельный запуск процессов. Это ускоряет выполнение на машине с многоядерным процессором.

Пример 16-5. Файл журнала: использование xargs для мониторинга системного журнала

Пример 16-6. Копирование файлов из текущего каталога в другой

Пример 16-7. Уничтожение процессов по имени

Пример 16-8. Частотный анализ слов с помощью xargs

Универсальный оценщик выражений: объединяет и оценивает аргументы в соответствии с заданной операцией (аргументы должны быть разделены пробелами). Операции могут быть арифметическими, сравнением, строковыми или логическими.

возвращает сообщение об ошибке, выражение: деление на ноль

Недопустимые арифметические операции запрещены.

Оператор умножения должен быть экранирован при использовании в арифметическом выражении с expr .

Увеличить переменную с тем же эффектом, что и let y=y+1 и y=$(($y+1)) . Это пример арифметического расширения .

Извлечь подстроку из символов $length, начиная с $position.

Пример 16-9. Использование выражения

Примечания [1]

И даже когда xargs не является строго необходимым, он может ускорить выполнение команды, включающей пакетную обработку нескольких файлов.

Связывание команд в Linux позволяет нам выполнять несколько команд одновременно и напрямую через терминал. Это похоже на короткие сценарии оболочки, которые можно запускать напрямую через терминал. Цепочка команд Linux — это метод объединения нескольких команд таким образом, что каждая из них может выполняться последовательно в зависимости от оператора, который их разделяет, и эти операторы решают, как команды будут выполняться. Это позволяет нам запускать несколько команд последовательно или одновременно.

Операторы

Работа с операторами цепочки

<р>1. Оператор амперсанда (&): используется для запуска команды в фоновом режиме, чтобы можно было выполнять другие команды. Он отправляет процесс/скрипт/команду в фоновый режим, чтобы другие команды могли выполняться на переднем плане. Это повышает эффективность использования системных ресурсов и ускоряет выполнение скриптов. Это также называется созданием или разветвлением дочернего процесса на других языках программирования. Знак амперсанда можно использовать следующим образом:

<р>2. Оператор AND (&&): Команда, следующая за этим оператором, будет выполняться только в том случае, если предшествующая ей команда будет успешно выполнена. Это полезно, когда мы хотим выполнить команду, если первая команда была выполнена успешно.

<р>3. Оператор точки с запятой (;): используется для последовательного запуска нескольких команд за один раз. Но важно отметить, что команды, объединенные в цепочку оператором (;), всегда выполняются последовательно.Если две команды разделены оператором, то вторая команда всегда будет выполняться независимо от статуса выхода первой команды. В отличие от оператора амперсанда выполнение второй команды не зависит от статуса выхода первой команды. Даже если первая команда не будет успешно выполнена, т. е. статус выхода не равен нулю, вторая команда всегда будет выполняться.

Эти три команды будут выполняться последовательно. Но выполнение команды, предшествующей оператору ( ; ), будет выполнено, даже если выполнение первой команды не удалось.

<р>4. Логический оператор ИЛИ (||): команда, следующая за этим оператором, будет выполняться только в том случае, если выполнение предшествующей ей команды завершилось неудачно. Это очень похоже на оператор else. Если статус выполнения первой команды отличен от нуля, будет выполнена вторая команда.

<р>5. Оператор трубопровода (|): этот оператор отправляет вывод первой команды на ввод второй команды.

В приведенной выше команде wc -l отображается количество строк. ls -l отображает список файлов в системе. Первая команда отображает количество файлов в каталоге. ls – l перечисляет имена файлов, и этот вывод отправляется следующей команде, которая подсчитывает количество строк во входных данных. В результате с помощью канала мы получаем количество файлов в каталоге.

<р>6. Оператор NOT (!) Используется для инвертирования выражения в command/. Мы можем использовать его для удаления всех файлов, кроме одного в каталоге.

Эта команда удалит все файлы в каталоге, кроме файла .txt. На изображении ниже мы создаем несколько файлов с помощью команды touch внутри каталога. ls показывает файлы в каталоге. Чтобы удалить все файлы, кроме «a.txt», мы используем! Оператор. Если мы снова перечислим файлы, мы увидим, что все файлы, кроме .txt, удалены.

<р>7. Операторы перенаправления (‘’,’>>’): этот оператор используется для перенаправления вывода команды или группы команд в поток или файл. Этот оператор может использоваться для перенаправления либо стандартного ввода, либо стандартного вывода, либо того и другого. Почти все команды принимают ввод с операторами перенаправления.

Первая команда создает файл с именем «имя_файла» (оператор перенаправления >> позволяет нам вводить данные в файл), а вторая команда сортирует содержимое файла. Обратитесь к изображению ниже, мы сначала создаем файл с числами, а затем используем эту команду. Это сортирует содержимое файлов.

<р>8. Операторы AND, OR как условие if-else: эта команда может использоваться как оператор if-else. Это комбинация логического И и логического ИЛИ.

Эта команда сначала проверит, существует ли каталог «ABC» или нет. Если он не существует, создается новый каталог, иначе «ABC» становится текущим каталогом. Обратитесь к изображению ниже, каталог с именем «ABC» не существует и, следовательно, он создан. Когда та же команда выполняется во второй раз, каталог уже существует, и, следовательно, «ABC» становится текущим каталогом.

<р>9. Оператор конкатенации (\): используется для объединения больших команд в несколько строк в оболочке. Это также улучшает читабельность для пользователей. Большая команда разбивается на несколько строк и, следовательно, используется для выполнения больших команд.

Откроется файл с именем text(1).

<р>10. Приоритет: эта команда используется для установки значения приоритета, чтобы несколько команд могли выполняться в заданном порядке.

В первом случае, если первая команда выполнена успешно, вторая будет выполнена, а третья не будет выполнена. Но во втором случае будет выполнена третья команда, поскольку приоритет устанавливается с помощью оператора (). Обратитесь к изображению ниже: если каталог существует (первая команда), то текущий каталог становится PQR (вторая команда), но в первом случае третья команда не выполняется, а во втором случае, когда используется оператор приоритета, тогда третья команда также выполняется.

<р>11. Комбинированный оператор (<>): выполнение команды, следующей за этим оператором, зависит от выполнения первой команды. Набор команд, объединенных с помощью оператора <>, выполняется, когда предыдущая команда успешно выполнена.

В первом случае всегда будет напечатано приветствие. Если файл существует, команда будет выполнена, поскольку она предшествует оператору &&. Если мы хотим выполнить и вторую, и третью команды, только если файл существует, то мы используем операторы <> для объединения команд.

В Unix-подобных операционных системах make — это утилита для создания и поддержки групп программ (и других типов файлов) из исходного кода.

Эта страница посвящена версии make для GNU/Linux.

Описание

Задачей утилиты make является автоматическое определение частей большой программы, которые необходимо перекомпилировать, и выполнение команд, необходимых для их повторной компиляции. В этой документации описывается реализация GNU команды make, написанная Ричардом Столлманом и Роландом Макгратом и в настоящее время поддерживаемая Полом Смитом. Многие из приведенных ниже примеров показывают программы на C, поскольку они наиболее распространены, но вы можете использовать make с любым языком программирования, компилятор которого можно запустить с помощью команды оболочки. На самом деле make не ограничивается программами. Вы можете использовать его для описания любой задачи, в которой одни файлы должны автоматически обновляться из других при изменении других.

Чтобы подготовиться к использованию make, вы должны написать файл с именем makefile, в котором описаны отношения между файлами в вашей программе и указаны команды для обновления каждого файла. В программе обычно исполняемый файл обновляется из объектных файлов, которые, в свою очередь, создаются путем компиляции исходных файлов.

После того, как подходящий make-файл существует, каждый раз, когда вы изменяете некоторые исходные файлы, эта простая команда оболочки:

достаточно для выполнения всех необходимых перекомпиляций. Программа make использует базу данных makefile и время последней модификации файлов, чтобы решить, какие из файлов необходимо обновить. Для каждого из этих файлов он выдает команды, записанные в базе данных.

make выполняет команды в make-файле для обновления одного или нескольких целевых имен, где name обычно является программой. Если опция -f отсутствует, make будет искать make-файлы GNUmakefile, makefile и Makefile в указанном порядке.

Обычно make-файл следует называть либо makefile, либо Makefile. (Официально рекомендуемое имя — Makefile, поскольку оно отображается в начале списка каталогов, рядом с другими важными файлами, такими как README.) Первое выбранное имя, GNUmakefile, не рекомендуется для большинства make-файлов. Вы должны использовать это имя, если у вас есть make-файл, специфичный для GNU make, и он не будет понят другими версиями make. Если makefile представляет собой тире ("-"), читается стандартный ввод.

сделать обновления целью, если она зависит от необходимых файлов, которые были изменены с момента последнего изменения цели, или если цель не существует.

Синтаксис

Параметры

< /tr> < td> Исключите использование встроенных неявных правил. Кроме того, очистите список суффиксов по умолчанию для суффиксных правил.
-b, -m Эти параметры игнорируются, но включены для совместимости с другими версиями make.
-B, --always-make Безусловно сделать все цели.
-C dir, --directory=dir Перейдите в каталог dir, прежде чем читать make-файлы или делать что-либо еще. Если указано несколько опций -C, каждая из них интерпретируется относительно предыдущей: -C / -C и т.д. эквивалентны -C /etc. Обычно используется с рекурсивными вызовами make.
-d Печать отладочной информации в дополнение к обычной обработке. В отладочной информации говорится, какие файлы рассматриваются для переделки, какое время файла сравнивается и с какими результатами, какие файлы действительно необходимо переделать, какие неявные правила учитываются и применяются; все интересное о том, как make решает, что делать.
--debug[=FLAGS] Печать отладочной информации в дополнение к обычной обработке. Если ФЛАГИ опущены, то поведение такое же, как если бы была указана опция -d. ФЛАГИ могут быть a для всего вывода отладки (так же, как при использовании -d), b для базовой отладки, v для более подробной базовой отладки, i для отображения неявных правил, j для подробностей о вызове команд и m для отладки при переделке make-файлов.
-e,
--environment-overrides
Приоритет переменных, взятых из среды, над переменными из make-файлов.
-f файл, --file=файл,
--makefile=файл< /td>
Использовать файл в качестве make-файла.
-i, --ignore-errors Игнорировать все ошибки в командах, выполняемых для переделки файлов.
-I dir, --include-dir=dir Указывает каталог < i>dir для поиска включенных make-файлов. Если для указания нескольких каталогов используется несколько опций -I, поиск в каталогах выполняется в указанном порядке. В отличие от аргументов других флагов make, каталоги, указанные с флагами -I, могут идти сразу после флага: разрешено -Idir, а также -I ​​dir. Этот синтаксис разрешен для совместимости с флагом -I препроцессора C.
-j [jobs], --jobs[=jobs ] Указывает количество заданий (команд), которые должны выполняться одновременно. Если имеется более одной опции -j, действует последняя. Если опция -j указана без аргумента, make не будет ограничивать количество заданий, которые могут выполняться одновременно.
-k, --keep-going Продолжать как можно дольше после ошибки. В то время как сбойный таргет (и те, что от него зависят) нельзя переделать, остальные зависимости этих таргетов все равно можно обработать.
-l [ load],
--load-average[=load]
Указывает, что новые задания (команды) не должны запускаться, если есть другие задания работает, а средняя нагрузка не ниже load (число с плавающей запятой). Без аргумента удаляет предыдущий предел загрузки.
-L,
--check-symlink-times
Используйте самое последнее время модификации между символическими ссылками и целью.
-n, --just-print,
--dry-run, --recon
Вывести команды, которые должны быть выполнены, но не выполнять их.
-o file, --old-file=file< /i>,
--assume-old=file
Не переделывать файл file, даже если он старше своих зависимостей , и ничего не переделывать из-за изменений в файле. По сути, файл считается очень старым, а его правила игнорируются.
-p, --print-data-base Распечатать базу данных (правила и значения переменных), полученные в результате чтения make-файлов; затем выполните как обычно или как указано иным образом. Это также распечатывает информацию о версии, заданную параметром -v (см. ниже). Чтобы распечатать базу данных, не пытаясь переделать какие-либо файлы, используйте make -p -f/dev/null.
-q, --question " Режим вопросов». Не запускайте никаких команд и ничего не печатайте; просто верните нулевой статус выхода, если указанные цели уже обновлены, и ненулевой в противном случае.
-r, --no-builtin-rules
-R, --no-builtin-variables Не определять никаких встроенных -в переменных.
-s, --silent, --quiet Тихая работа; не печатать команды по мере их выполнения.
-S, --no-keep-going,
--stop
Отмена действие опции -k. В этом нет необходимости, за исключением рекурсивного make, где -k может быть унаследован от make верхнего уровня через MAKEFLAGS или если вы установили -k в MAKEFLAGS в вашей среде.
- t, --touch Прикоснитесь к файлам (пометьте их как актуальные, не изменяя их на самом деле) вместо того, чтобы запускать их команды. Это используется, чтобы сделать вид, что команды были выполнены, чтобы обмануть будущие вызовы make.
-v, --version Вывести версию make ; также Copyright, список авторов и уведомление об отсутствии гарантии.
-w, --print-directory Напечатать сообщение, содержащее рабочий каталог до и после другой обработки. Это может быть полезно для отслеживания ошибок из-за сложных гнезд рекурсивных команд make.
--no-print-directory Выключите -w, даже если он был включен неявно.
-W file, --what-if=file,
--new-file=file,
--assume-new=file
Представить, что целевой файл только что был изменен . При использовании с флагом -n показывает, что произойдет, если вы измените этот файл. Без -n это почти то же самое, что запустить команду touch для заданного файла перед запуском make, за исключением того, что время модификации изменяется только внутри make.
-- warn-undefined-variables Предупреждать при обращении к неопределенной переменной.

Типичное использование

make обычно используется для сборки исполняемых программ и библиотек из исходного кода. Вообще говоря, make применим к любому процессу, который включает в себя выполнение произвольных команд для преобразования исходного файла в целевой результат. Например, make может использоваться для обнаружения изменений, внесенных в файл изображения (источник), а действия по преобразованию могут заключаться в преобразовании файла в определенный формат, копировании результата в систему управления контентом и последующей отправке по электронной почте. предопределенному набору пользователей, что вышеуказанные действия были выполнены.

make вызывается со списком имен целевых файлов для сборки в качестве аргументов командной строки:

Без аргументов make создает первую цель, которая появляется в ее make-файле, которая традиционно является целью с именем all.

make решает, нужно ли регенерировать цель, сравнивая время модификации файла. Это решает проблему предотвращения создания файлов, которые уже обновлены, но терпит неудачу, когда файл изменяется, но время его модификации остается в прошлом. Такие изменения могут быть вызваны восстановлением более старой версии исходного файла или когда сетевая файловая система является источником файлов, а ее часы или часовой пояс не синхронизированы с машиной, на которой выполняется make. Пользователь должен справиться с этой ситуацией, запустив полную сборку. И наоборот, если время модификации исходного файла находится в будущем, это может привести к ненужной перестройке.

Макет-файлы

make ищет в текущем каталоге make-файл для использования. GNU make ищет в файлах файл с именем GNUmakefile, makefile, а затем Makefile и запускает указанные цели из этого файла.

Язык makefile похож на декларативное программирование, в котором описываются необходимые конечные условия, но порядок выполнения действий не важен. Это может сбивать с толку программистов, привыкших к императивному программированию, которое явно описывает, как будет достигнут конечный результат.

Одной из проблем автоматизации сборки является адаптация процесса сборки к конкретной платформе. Например, компилятор, используемый на одной платформе, может не принимать те же параметры, что и на другой. С этим не очень хорошо справляется make сама по себе. Эта проблема обычно решается путем создания отдельных инструкций по сборке для конкретной платформы, которые, в свою очередь, могут обрабатываться командой make. Обычными инструментами для этого процесса являются autoconf и cmake.

Правила

Макет-файл по существу состоит из правил. Каждое правило начинается со строки зависимости, которая определяет цель, за которой следует двоеточие (":") и, возможно, перечисление компонентов (файлов или других целей), от которых зависит цель. Линия зависимости устроена так, что цель (левая часть двоеточия) зависит от компонентов (правая часть двоеточия). Обычно компоненты называют предварительными условиями цели.

Здесь символ табуляции. Обычно каждое правило имеет одну уникальную цель, а не несколько целей.

Например, объектный файл C .o создается из файлов .c, поэтому файлы .c идут первыми (т. е. конкретная цель объектного файла зависит от исходного файла C и файлов заголовков). Поскольку make сам не понимает, не распознает и не различает разные типы файлов, это открывает возможность человеческой ошибки. Забытая или дополнительная зависимость может быть не сразу очевидна и может привести к незначительным ошибкам в сгенерированном программном обеспечении. Можно написать make-файлы, которые генерируют эти зависимости, вызывая сторонние инструменты, и некоторые генераторы make-файлов, такие как набор инструментов GNU automake, могут делать это автоматически.

После каждой строки зависимости может следовать ряд командных строк, которые определяют, как преобразовать компоненты (обычно исходные файлы) в целевые (обычно «выходные данные»). Если какой-либо из компонентов был изменен, запускаются командные строки.

В GNU make первая команда может появиться в той же строке после предварительных условий, разделенных точкой с запятой:

Каждая командная строка должна начинаться с символа табуляции, чтобы ее можно было распознать как команду. Табуляция — это символ пробела, но пробел не имеет такого же специального значения. Это проблематично, так как может не быть визуальной разницы между табуляцией и набором пробелов. Этот аспект синтаксиса make-файлов часто подвергается критике, и его важно принять к сведению.

Однако GNU make (начиная с версии 3.82) позволяет пользователю выбирать любой символ (один символ) в качестве префикса рецепта, используя специальную переменную .RECIPEPREFIX, например:

Каждая команда выполняется отдельной оболочкой или экземпляром интерпретатора командной строки. Поскольку операционные системы используют разные интерпретаторы командной строки, это может привести к непереносимости make-файлов. Например, GNU make по умолчанию выполняет команды с /bin/sh, который является оболочкой, в которой обычно используются команды Unix, такие как cp.

В правиле могут не быть определены командные строки. Строка зависимости может состоять исключительно из компонентов, ссылающихся на цели, например:

Командные строки правила обычно устроены так, что они генерируют цель. Пример: если "file.html" новее, он преобразуется в текст. Содержимое make-файла:

Приведенное выше правило будет срабатывать при обновлении файла "file.txt".

В следующем вызове make обычно использует это правило для обновления цели "file.txt", если "file.html" был новее:

Командные строки могут иметь один или несколько из следующих трех префиксов:

  • дефис-минус (-), указывающий, что ошибки игнорируются
  • знак at (@), указывающий, что команда не выводится на стандартный вывод до ее выполнения
  • знак плюс (+), команда выполняется, даже если make вызывается в режиме "не выполнять"

Игнорирование ошибок и заглушение всего эхо-вывода также можно получить с помощью специальных целей ".IGNORE" и ".SILENT" соответственно.

Макросы

Makefile может содержать определения макросов. Макросы обычно называют переменными, если они содержат простые строковые определения, такие как «CC=clang», которые определяют clang как компилятор C. Макросы в make-файлах могут быть переопределены в аргументах командной строки, передаваемых утилите make. переменные среды также доступны в виде макросов.

Макросы позволяют пользователям указывать вызываемые программы и другое пользовательское поведение в процессе сборки. Например, как только что показано, макрос "CC" часто используется в make-файлах для ссылки на расположение компилятора C.

Новые макросы традиционно обозначаются заглавными буквами:

Макрос используется путем его расширения. Традиционно это делается путем заключения его имени внутри $(). Эквивалентная форма использует фигурные скобки, а не круглые скобки, например, $<>, который используется в операционных системах BSD.

Макросы могут состоять из команд оболочки с использованием оператора подстановки команд, обозначаемого обратными кавычками ("` `").

Содержимое определения сохраняется "как есть". Используется отложенное вычисление, означающее, что макросы обычно раскрываются только тогда, когда их раскрытия действительно необходимы, например, при использовании в командных строках правила. Например:

Общий синтаксис переопределения макросов в командной строке:

Makefiles могут получить доступ к любому из ряда предопределенных внутренних макросов с помощью "?" и "@" является наиболее распространенным.

Читайте также: