Код выхода в конце сценария bash

touch указано как изменение времени доступа и модификации файла; изменение времени изменения является побочным эффектом изменения метаданных файла, и touch не имеет над этим никакого контроля (см. также функции futimens() и utimensat() используемые touch).

-a и -m понимаются в этом контексте: по умолчанию touch изменяет и время доступа, и время модификации (и система обновляет время изменения); с -a он изменяет только время доступа, с -m - только время модификации.

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

22
07.09.2016, 03:33
2 ответа

Встроенная команда exit выполняет выход из оболочки (из справочника Bash ):

exit [n]
Выйти из оболочки, возвращая статус n родителю оболочки . Если n опущено, статус выхода соответствует последней выполненной команде . Любая ловушка при EXIT выполняется до завершения работы оболочки.

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

Конечно, чаще вы будете использовать exit изнутри if , чтобы завершить сценарий посередине.

Они должны вывести 1 ( $? содержит код выхода, возвращенный предыдущей командой):

sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?

Хотя это должно вывести 0:

sh -c "false; exit 0" ; echo $?

Я не уверен, что концепция "сбой" сценария при выполнении exit имеет смысл, поскольку некоторые команды, выполняемые сценарием, вполне могут завершиться ошибкой, но сам сценарий завершится успешно. Автор сценария решает, что будет успешным, а что нет.

Кроме того, стандартный диапазон кодов выхода составляет 0..255. Коды выше 127 используются оболочкой для обозначения процесса, завершенного сигналом, но они могут быть возвращены обычным способом. Системный вызов wait фактически возвращает более широкое значение, а остальные содержат биты состояния, установленные операционной системой.

33
27.01.2020, 19:42

0 означает успех, положительные целые числа означают неудачу. Существует 255 различных кодов ошибок, но значения 126 и выше зарезервированы, чтобы указать, что программа не может быть запущена (126 или 127) или была прервана сигналом (129 и выше). См. Код выхода по умолчанию при завершении процесса? и Какие значения возврата / выхода я могу использовать в функциях / скриптах bash? для получения дополнительной информации.

Статус выхода сценария оболочки - это статус выхода последней команды, выполненной сценарием. Так, например,

#!/bin/sh
somecommand

возвращает статус выхода somecommand , тогда как

#!/bin/sh
somecommand
exit 0

возвращает 0 независимо от того, что возвратило somecommand .Этот второй сценарий также может быть записан

#!/bin/sh
somecommand
true

. Помещение exit 0 в конец сценария не обязательно приводит к возврату 0. Это только заставляет возвращать 0, когда достигается конец сценария. Например, следующий сценарий всегда возвращает 3:

#!/bin/sh
exit 3
exit 0

Следующий сценарий также всегда возвращает код ошибки в дополнение к отображению сообщения о синтаксической ошибке:

#!/bin/sh
}
exit 0

Следующий сценарий возвращает либо 1, либо 0 в зависимости от своего первого аргумента:

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

Следующий сценарий возвращает статус of somecommand , поскольку set -e вызывает завершение работы сценария в случае сбоя somecommand :

#!/bin/sh
set -e
somecommand
exit 0
24
27.01.2020, 19:42

Теги

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