Встроенные утилиты test
и [
утилиты имеют тесты -nt
(«новее чем») и -ot
(«старше чем») в большинстве оболочек, даже когда оболочка работает в «режиме POSIX» (также верно для внешних утилит с такими же именами на системы, к которым у меня есть доступ). Эти тесты предназначены для сравнения меток времени изменения двух файлов. Их документированная семантика немного различается в разных реализациях (в отношении того, что происходит, если тот или иной файл существует в не), но они не включены в спецификацию POSIX. за test
полезность .
Они не были перенесены в
test
утилиту, когда условная команда была удалена из оболочки [KornShell], потому что они не были включены вtest
утилиту, встроенную в исторические реализацииsh
утилиты.
Предполагая, что я хотел бы сравнить метку времени изменения между файлами в /bin/sh
сценарии оболочки, а затем принять меры в зависимости от того, является ли один файл более новым, чем другой, как в
if [ "$sigfile" -nt "$timestamp" ] ||
[ "$sigfile.tmp" -nt "$timestamp" ]
then
return
fi
... какую другую утилиту я мог бы использовать, кроме make
(что сделало бы остальную часть сценария громоздкой, если не сказать больше)? Или я должен просто предположить, что никто никогда не будет запускать сценарий для «исторической реализации sh
», или смириться с написанием для конкретной оболочки вроде bash
?
источник
-nt
функцию,test
которая ожидается с ок. 1995. Вы должны использоватьfind
выражение basd, дажеbash
если вам нравится правильное поведение.Ответы:
POSIXLY:
Использование абсолютного пути к файлам предотвращает ложное срабатывание, так как имя файла содержит только новые строки.
В случае использования относительного пути, измените
find
команду на:источник
$f1
содержать только-exec echo x \;
или с аналогичным?-printf
было бы легко, если бы это было стандартноfind
статус выхода не зависит от того, какие отдельные тестыfind
возвращаются, за исключением, возможно, ошибки в самом деле при запуске этих тестов.find
выходит 0, даже если файлы не найдены.[ / -nt /nofile ]
варьируется в зависимости от реализации (но никогда не выдает никакой ошибки).Это может быть случай использования одной из самых старых команд Unix
ls
.Результат верен, если a новее, чем b.
источник
-
(отсутствует--
). Вам нужно,-L
чтобы это было эквивалентно-nt
. Это не работает, чтобы сравнитьx
и,$'x\nx'
например.Вы задали интересный вопрос и сделали заявление, которое сначала нужно проверить.
Я проверил поведение:
с различными снарядами. Вот результаты:
bash не работает - ничего не печатает.
чушь работает
Черта не работает - ничего не печатает.
ksh88 не работает - ничего не печатает.
кш93 работает
mksh не работает - ничего не печатает.
шикарная печать: шикарная: [: -nt: неожиданный оператор / операнд
Яш работает
zsh работает в новых версиях , старые версии ничего не печатают
Таким образом, четыре из девяти оболочек поддерживают функцию -nt и правильно ее реализуют. Правильно в этом случае означает: способен сравнивать метки времени на последних платформах, которые поддерживают детализацию меток времени в течение секунды . Обратите внимание, что выбранные мной файлы отличаются только несколькими микросекундами в своих отметках времени.
Поскольку легче найти работающую
find
реализацию, я рекомендую заменитьна
find
основе выражения.работает по крайней мере до тех пор, пока
$file1
не содержит только новые строки.немного медленнее, но работает правильно.
Кстати, что касается make, я не могу говорить за все реализации make, но
SunPro Make
поддерживает сравнение времени с наносекундной гранулярностью, начиная с прибл. 20 лет, покаsmake
иgmake
добавил эту функцию недавно.источник
find
реализации, такие как busybox или heirloom-toolchest, будут иметь такое же ограничение.-L
чтобыfind
версия была эквивалентна-nt
. Кроме того, произойдет сбой в именах файлов, начинающихся с-
или!
,(
...find
естьfind -f "$file"
для этого, но это не портативно.