[
] Вы можете использовать комбинацию []SetEnvIf[
] и []env=[
] в определении журнала. [
] [
]В руководстве Apache это описано в разделе "Условный журнал", цитируя здесь.[
] [
] [][]Conditional Logs[][
] []Бывают моменты, когда удобно исключить некоторые записи из журналы доступа, основанные на характеристиках запроса клиента. Данный сайт легко выполняется с помощью переменных окружения. Во-первых, переменная окружения должна быть установлена, чтобы показать, что запрос соответствует некоторые условия. Обычно это выполняется с помощью [
] []SetEnvIf[
]. Затем . выражение []env=[
] директивы []CustomLog[
] используется для включения или исключить запросы, в которых установлена переменная окружения. Некоторые примеры:[
] [
# Mark requests from the loop-back interface
SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
# Mark requests for the robots.txt file
SetEnvIf Request_URI "^/robots\.txt$" dontlog
# Log what remains
CustomLog logs/access_log common env=!dontlog
] [
]Это описано в []этом разделе[] руководства.[
] [
]Вы бы искали что-то вроде (не тестируемого)[
] [
][]SetEnvIf Remote_Addr "157\. 98\.65\.xxx" донтлог[
][
] [
]или[
] [
][]SetEnvIf User-Agent "collectd/4\.10\.9" донтлог[
][
]
echo one && отголосок два & отголосок три & & отголосок в четыре раза
Имейте в виду, что это анализируется как
echo one && echo two &
echo three && echo four
Я буду считать, что команды echo
являются успешными (они будут неудачными только в крайних случаях, таких как переадресация на файл на полном диске). Таким образом, этот фрагмент параллельно выполняет две задачи: одна печатает строки одна
и две
, а другая - строки три
и четыре
. Интерпретация одной
и двух
с тремя
и четырьмя
не гарантируется и, вероятно, будет варьироваться от системы к системе, от оболочки к оболочке и от вызова к вызову. Для такого игрушечного примера вы можете наблюдать воспроизводимые результаты на слегка загруженной системе, но это не то, на что вы можете рассчитывать.
echo one && (эхо два и) отголосок три & & отголосок в четыре раза
Вы изменили синтаксический разбор: здесь в фоновом режиме выполняется только команда echo two
. Это гарантирует, что сначала будет выведено одно
, и, как и до три
всегда будут до четыре
, но размещение двух
может быть где угодно после одного
.
Оболочка печатает сообщение о фоновых процессах только в том случае, если они запущены из основной оболочки, а не когда они запущены в подоболочке. Круглые скобки создают подоболочку, поэтому (echo two &)
не заставляет оболочку печатать какие-либо сообщения. Это создает фоновый процесс, но не фоновое задание .
echo one && (сон 2 и эхо 2 и эхо 2 и) отголосок три & & отголосок в четыре раза
В этом фрагменте фоновое задание переходит в спящий режим на 2 секунды до вывода двух
. Это делает чрезвычайно вероятным (но фактически не гарантированным), что два
будут выведены после три
и четыре
.
Часть 1
echo one &&
echo two &
echo three &&
echo four
Это можно переписать как
echo one && echo two &
echo three && echo four
Причина, по которой вы получаете три
и четыре
во-первых, это просто то, что требуется больше времени, чтобы заставить подоболочку обрабатывать один
и два
и работать, чем для печати три
и четыре
.
Вы можете увидеть это более четко, как это
echo one && echo two &
sleep 1
echo three && echo four
В этой ситуации вы получите один
и два
, а затем через секунду три
и четыре
.
Обратите внимание, что в исходном сценарии нет гарантии, что один
и два
не будут смешаны с выходными данными three
и ] four
, возможно, даже с интерполируемыми словами, такими как thonreee
или twfouro
.
Часть 2
echo one &&
(echo two &)
echo three &&
echo four
Это можно переписать как
echo one && (echo two &)
echo three && echo four
Здесь происходит то, что один
печатается немедленно, а затем два
запускаются в подоболочке . Затем (последовательно) выполняется следующая строка, в результате чего получается три
и четыре
. В вашей конкретной ситуации подоболочка небольшая и достаточно быстрая, чтобы можно было напечатать два
до вывода три
. Но и в этом нет никаких гарантий.
Часть 3
Скобки объединяют операторы в подоболочку. Амперсанд &
применяется к оператору, но в этом случае вы использовали &&
, чтобы связать две команды вместе, поэтому их нужно рассматривать как один оператор.
Возможно, вам стоит использовать echo one; echo two
вместо echo one && echo two
? Они очень разные. Точка с запятой ;
разделяет две команды, которые затем выполняются независимо, но последовательно. Двойной амперсанд &&
объединяет две команды вместе как логическое И , так что вторая будет выполняться только в случае успешного завершения первой. Сравните ложь; echo yes
, false && echo yes
и true && echo yes
. Затем поэкспериментируйте, заменив &&
( логическое И ) на ||
( логическое ИЛИ ).
Бонус
Вы теряете уведомление об управлении заданием, потому что подоболочка не имеет управления заданием.