POSIX sh에서 -nt/-ot 테스트 수행

POSIX sh에서 -nt/-ot 테스트 수행

내장 test및 유틸리티는 쉘이 시스템에서 "POSIX 모드"(동일한 이름의 외부 유틸리티의 경우에도 동일)에서 실행되는 경우에도 [대부분의 쉘에서 -nt("최신") 및 ("이전") 테스트를 갖습니다. -ot)에 액세스할 수 있습니다. 이 테스트는 두 파일의 수정 타임스탬프를 비교합니다. 그들이 문서화하는 의미는 구현마다 약간 다르지만(하나 또는 다른 파일이 존재하거나 존재하지 않는 경우 발생하는 일에 대해) 포함되지 않습니다.POSIX 사양. test공공 시설을 위해.

조건부 명령이 [KornShell] 쉘에서 제거되면 유틸리티 기록 구현에 내장된 유틸리티 test에 아직 포함되지 않았기 때문에 유틸리티 로 전송되지 않습니다 .testsh

/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.

관련 정보