내장 test
및 유틸리티는 쉘이 시스템에서 "POSIX 모드"(동일한 이름의 외부 유틸리티의 경우에도 동일)에서 실행되는 경우에도 [
대부분의 쉘에서 -nt
("최신") 및 ("이전") 테스트를 갖습니다. -ot
)에 액세스할 수 있습니다. 이 테스트는 두 파일의 수정 타임스탬프를 비교합니다. 그들이 문서화하는 의미는 구현마다 약간 다르지만(하나 또는 다른 파일이 존재하거나 존재하지 않는 경우 발생하는 일에 대해) 포함되지 않습니다.POSIX 사양. test
공공 시설을 위해.
조건부 명령이 [KornShell] 쉘에서 제거되면 유틸리티 기록 구현에 내장된 유틸리티
test
에 아직 포함되지 않았기 때문에 유틸리티 로 전송되지 않습니다 .test
sh
/bin/sh
아래와 같이 쉘 스크립트의 파일 간 수정 타임스탬프를 비교한 다음 한 파일이 다른 파일보다 최신인지 여부에 따라 조치를 취한다고 가정해 보겠습니다 .
if [ "$sigfile" -nt "$timestamp" ] ||
[ "$sigfile.tmp" -nt "$timestamp" ]
then
return
fi
... make
(이렇게 하면 스크립트의 나머지 부분이 다루기 힘들게 된다는 점을 제외하면) 어떤 다른 유틸리티를 사용할 수 있습니까? 아니면 아무도 "역사적 구현"에 대해 스크립트를 실행하지 않을 것이라고 가정해야 할까요? sh
아니면 하나를 포기해야 할까요?특정한쉘 같은 bash
?
답변1
앞쪽:
f1=/path/to/file_1
f2=/path/to/file_2
if [ -n "$(find -L "$f1" -prune -newer "$f2")" ]; then
printf '%s is newer than %s\n' "$f1" "$f2"
fi
파일에 대한 절대 경로를 사용하면 파일 이름에 줄 바꿈만 포함된 거짓 긍정이 방지됩니다.
상대 경로를 사용하는 경우 find
명령을 다음으로 변경합니다.
find -L "$f1" -prune -newer "$f2" -exec echo . \;
답변2
이것은 아마도 가장 오래된 Unix 명령 중 하나의 경우일 것입니다 ls
.
x=$(ls -tdL -- "$a" "$b")
[ "$x" = "$a
$b" ]
a가 b보다 최신이면 결과는 참입니다.
답변3
흥미로운 질문을 하고 먼저 확인해야 할 주장을 합니다.
다음 동작을 확인했습니다.
$shell -c '[ Makefile -nt SCCS/s.Makefile ] && echo newer'
다양한 껍질로. 결과는 다음과 같습니다.
세게 때리다작동하지 않습니다. 아무것도 인쇄되지 않습니다.
보쉬 일하다
스프린트작동하지 않습니다. 아무것도 인쇄되지 않습니다.
크쉬 88작동하지 않습니다. 아무것도 인쇄되지 않습니다.
크쉬 93 일하다
므케시작동하지 않습니다. 아무것도 인쇄되지 않습니다.
사치인쇄: posh: [: -nt: 예기치 않은 연산자/피연산자
야쉬 일하다
다루기 힘든 최신 버전에서 작동, 이전 버전은 아무것도 인쇄하지 않습니다
따라서 9개의 쉘 중 4개가 지원됩니다.-nt기능을 갖추고 올바르게 구현되었습니다. 이 맥락에서 올바른 의미는 다음과 같습니다.1초 미만의 타임스탬프 세분성을 지원하는 최신 플랫폼의 타임스탬프를 비교하는 기능. 내가 선택한 파일의 타임스탬프는 일반적으로 몇 마이크로초 정도만 다릅니다.
효율적인 구현을 찾는 것이 더 쉽기 때문에 find
교체하는 것이 좋습니다.
if [ "$file1" -nt "$file2" ] ; then
echo newer
fi
표현을 기반으로 합니다 find
.
if [ "$( find "$file1" -newer "$file2" )" ]; then
echo newer
fi
적어도 $file1
개행 문자를 포함하지 않는 한 작동합니다.
if [ "$( find -L "$file1" -newer "$file2" -exec echo newer \; )" ]; then
echo newer
fi
조금 느리지만 잘 작동합니다.
그런데:브랜드 정보모든 make 구현에 대해 말할 수는 없지만 SunPro Make
나노초 단위의 시간 비교는 약 1000000000000000000000000000000000부터 지원됩니다. 20년이 지난 지금 이 기능이 최근에 추가 smake
되었습니다 gmake
.