touch
указано как изменение времени доступа и модификации файла; изменение времени изменения является побочным эффектом изменения метаданных файла, и touch
не имеет над этим никакого контроля (см. также функции futimens()
и utimensat()
используемые touch
).
-a
и -m
понимаются в этом контексте: по умолчанию touch
изменяет и время доступа, и время модификации (и система обновляет время изменения); с -a
он изменяет только время доступа, с -m
- только время модификации.
Вы можете увидеть разницу, если укажете время, отличное от текущего: время доступа и/или модификации будет изменено на указанное вами значение, но время изменения будет обновлено до текущего времени.
Встроенная команда 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
фактически возвращает более широкое значение, а остальные содержат биты состояния, установленные операционной системой.
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