Wbudowane test
i [
narzędzia mają testy -nt
(„nowsze niż”) i -ot
(„starsze niż”) w większości powłok, nawet gdy powłoka działa w „trybie POSIX” (dotyczy to również zewnętrznych narzędzi o tych samych nazwach w systemy, do których mam dostęp). Testy te służą do porównywania znaczników czasu modyfikacji dwóch plików. Ich udokumentowana semantyka różni się nieznacznie w zależności od implementacji (w odniesieniu do tego, co się stanie, jeśli jeden lub drugi plik nie istnieje), ale nie są one uwzględnione w specyfikacji POSIX. dla test
narzędzia .
Nie zostały przeniesione do
test
narzędzia, gdy polecenie warunkowe zostało usunięte z powłoki [KornShell], ponieważ nie zostały uwzględnione wtest
narzędziu wbudowanym w historyczne implementacjesh
narzędzia.
Zakładając, że chciałbym porównać znacznik czasu modyfikacji między plikami w /bin/sh
skrypcie powłoki, a następnie podjąć działania w zależności od tego, czy jeden plik jest nowszy od drugiego, jak w
if [ "$sigfile" -nt "$timestamp" ] ||
[ "$sigfile.tmp" -nt "$timestamp" ]
then
return
fi
... jakiego innego narzędzia mógłbym użyć oprócz make
(co sprawiłoby, że reszta skryptu byłaby co najmniej niewygodna)? A może powinienem po prostu założyć, że nikt nigdy nie uruchomi skryptu na „historycznej implementacji sh
” lub nie zrezygnuje z pisania dla określonej powłoki bash
?
-nt
funkcjitest
w sposób, który jest oczekiwany od ok. 1995. Powinieneś używaćfind
wyrażenia basd, nawetbash
jeśli lubisz prawidłowe zachowanie.