Предполагая, что вы используете Linux, тайм-аут — самый простой способ сделать это. 08 :00 до 19 :00 составляет 11 часов, поэтому мы указываем timeout для запуска скрипта в течение 11 часов.
timeout 11h /home/username/script
Запустите задание с помощью cron в 08 :00 (или вручную, когда захотите )и автоматически завершите его в 19 :00 с другой записью cron
kill -9 /home/username/script
Я могу только думать об этом обосновании, и оно кажется мне довольно сильным.
Самый простой способ перевести булевы операции в компьютерную арифметику — использовать 0
вместо FALSE
и 1
вместо TRUE
, и тогда все операции с ними имеют смысл, т. е.
TRUE && TRUE = TRUE ( 1 * 1 = 1)
TRUE && FALSE = FALSE ( 1 * 0 = 0)
TRUE || FALSE = TRUE ( 1 + 0 = 1)
FALSE || FALSE = FALSE ( 0 + 0 = 0)
И так далее и тому подобное.
В то же время программам требуется несколько статусов выхода, чтобы сообщать о различных ошибках. Логично сделать правильный статус выхода как 0
, а затем использовать оставшиеся 255 (unsigned char )как плохие статусы выхода.
Теперь, конечно, 1
можно было бы сделать хорошим выходным статусом, но тогда плохие стали бы разорванным массивом 0
и 2..555
, что очень нелогично.
Существует несколько причин сбоя программы. Например, grep
дает сбой, если не находит искомый шаблон или не может открыть один из указанных файлов.
В настоящее время Unix позволяет передавать 1 (беззнаковый )байт значения (код возврата )от дочернего элемента к его родителю (Я игнорирую информацию о том, какой сигнал убил дочерний элемент, если было сгенерировано ядро и т. д., которое могло бы вернуть еще несколько битов ).
Поскольку существует несколько способов сбоя, имеет смысл использовать несколько кодов возврата для кодирования этих различных сбоев и иметь один код возврата для индикации успеха.
Отсюда следует, что(0
)является разумным выбором для обозначения успеха, остальные (1 -255 )указывают на отказ (и тип отказа ).
Было бы вполне возможно использовать 17 для обозначения успеха, а от 0 до 16 и от 18 до 255 означать неудачу, но для простоты было выбрано 0 для успеха и от 1 до 255 для неудач, поэтому существует единый диапазон. Столь же просто было бы использовать 255 для успеха и от 0 до 254 для неудач. Однако это ограничило бы будущие изменения возвратом более 8 бит и сохранением простоты единого диапазона кодов ошибок.
Вы путаете две разные вещи:
Целые числа, используемые в качестве логических значений.
Логическое значение — это ответ на вопрос :"Совпадает ли значение этой переменной со значением этой другой переменной?" Ответ: ложь или истина . Они могут быть закодированы как 0 или 1.
Целые числа, используемые в качестве статуса выхода -.
Статус выхода -является констатацией факта :«Утилита завершила работу после успешного выполнения того, о чем ее просили сделать.», «Утилита столкнулась с определенной ошибкой и завершилась ошибкой». Статус выхода -может быть закодирован как любое целое число от 0 до 127, где ноль означает успех или отсутствие ошибок .
Они похожи , но только потому, что оба используют целые числа как способ кодирования истинные и ложные(логические значения )или успешные и неудачно(статус выхода ). Другими вещами, в которых используются целые числа, являются количество сантиметров, на которые спортсмен может прыгнуть, и рейтинг, связанный с этим спортсменом на основе этого прыжка, но мы редко путаем их.
В языке C операторы if
воздействуют непосредственно на результат арифметического вычисления данного выражения. Поскольку оболочка всегда была ориентирована на выполнение программ и обработку конвейеров заданий и т. д., if
в оболочке делается оператор для определения того, успешно ли запущена утилита или нет.Это включает в себя проверку состояния выхода -запущенной утилиты.
Статус выхода -равен нулю , если утилита завершилась успешно. Вы получаете логическое значение, когда спрашиваете «Является ли статус выхода -нулевым?», что и делает оператор if
в оболочке(if utility; then echo ok; else not ok; fi
). Если утилита не прошла успешно, вы получите ложный результат этого теста, и затем вы можете начать смотреть на статус выхода -и диагностический вывод утилиты, чтобы попытаться выяснить, что пошло не так. неправильно.
Статус выхода -может кодировать конкретную причину, по которой утилита завершилась неудачно, подобно библиотечным функциям и системным вызовам в C, которые часто устанавливают «код состояния errno
», который кодирует информацию, аналогичную вызывающей стороне (, см. man errno
и, например, разделы RETURN VALUE
и ERRORS
в stat(2)
сman 2 stat
).
Утилита false
безуспешно ничего не делает. Вы можете видеть, что он терпит неудачу, потому что он устанавливает ненулевой статус выхода -:
$ false; echo "$?"
1
Это 1
не логическое значение. Это не -нулевой выход -, означающий сбой.
Если вы хотите использовать логическую логику в оболочке, используйте $((... ))
для вычисления вашего выражения и утилиту test
для сравнения:
if [ "$(( a == 12 ))" -ne 0 ]; then
echo 'a is 12'
fi
В этом примере значение $a
сравнивается как целое число с 12. Если $a
равно 12, арифметическое расширение расширится до 1
, в противном случае до 0
. Это логические значения .
Статус выхода -из [ "$(( a == 12 ))" -ne 0 ]
был бы нулевым, если $a
был равен 12, что приводило к выполнению echo
, или отличным от -нулем, если $a
не был t 12, что приводит к пропуску echo
.
Утилиты с более интересными статусами выхода -, чем просто 0 и 1, см., например. руководство curl
(раздел EXIT CODES
ближе к концу ), а руководство rsync
руководство (раздел EXIT VALUES
ближе к концу ).
Происхождение истинного = 1 и ложного = 0
Если вы хотите знать исторический контекст того, почему истина равна 1, а ложь равна 0, я хотел бы отметить, что булева алгебра была «изобретена» Джорджем Булем в 1847 году. Это было задолго до появления первых электронных компьютеров. Булева алгебра была опубликована в "МАТЕМАТИЧЕСКОМ АНАЛИЗЕ ЛОГИКИ". Вы можете прочитать копию проекта Гутенберга :http://www.gutenberg.org/files/36884/36884-pdf.pdf
.Я не утверждаю, что читал его подробно, но я просмотрел достаточно, чтобы увидеть, что сам Джордж Буль использовал 1 как истинное и 0 как ложное.
Влияние Буля на вычисления
Алгебра Буля («Булевая алгебра» )в значительной степени игнорировалась, пока она не была поднята спустя много времени после его смерти и использована в вычислениях. Еще до компьютеров на основе кремния булева алгебра стала полезной в отношении бинарной электроники (, в отличие от аналоговой ). Было просто перенести математические логические операторы в транзисторную схему (, см. здесь ). Отсюда было достаточно просто соединить несколько логических вентилей, чтобы представить число в двоичном виде и выполнить простую арифметику .
Что касается операторов «если», они были получены из ЦП операции «условный переход», где переход известен как goto
в языках более высокого уровня.
Для условных переходов ЦП должны определить полезный способ выбора перехода или отказа от перехода. Двумя наиболее распространенными условными операторами являются «переход, если ноль» и «переход, если отрицательный» (, см. подчеркнутую страницу 39 здесь ). Однако интерпретация числа как положительного или отрицательного может быть субъективной, поскольку одни и те же операции ЦП используются для двух дополнительных целых чисел со знаком как "беззнаковых" целых чисел.
Так что это все, чтобы сказать,общее утверждение if
остановилось на 0 для ложного и 1 для истинного, потому что:
Почему оболочка отличается?
Трудно найти происхождение оболочки, делающей противоположное. 0, потому что успех определенно восходит к 1970-м годам и возможно, самым ранним версиям unix(не уверен).
Я считаю, что программа может полностью преуспеть только в одном случае, но потерпеть неудачу во многих отношениях.
Что кажется очевидным, так это то, что команды true
и false
были разработаны в соответствии с интерпретацией оболочки использования статуса выхода команды в условной логике:
if first_command ; then
second_command
fi
Если приведенный выше код предназначен для запуска second_command
, если first_command
выполнено успешно. Тогда хорошим именем для логического заполнителя, который всегда завершается успешно, будет true
.