대시 "-nt" 동작

대시 "-nt" 동작

제가 생각할 수 있는 사용 사례는 -nt파일이 너무 오래되었거나 존재하지 않는 경우 파일을 업데이트하는 것입니다. Bash는 이것을 매우 잘 처리합니다.

$ bash -c 'touch 2.txt; sleep 1; touch 1.txt; [ 1.txt -nt 2.txt ]; echo $?;
[ 1.txt -nt 3.txt ]; echo $?'
0
0

그러나 Dash는 두 파일이 모두 존재하는 경우에만 예상대로 작동합니다.

$ dash -c 'touch 2.txt; sleep 1; touch 1.txt; [ 1.txt -nt 2.txt ]; echo $?;
[ 1.txt -nt 3.txt ]; echo $?'
0
1

저는 Dash 코드의 논리를 이해하려고 노력하고 있습니다. 이 문제는 다음과 같이 해결할 수 있습니다.

$ dash -c 'touch 1.txt; [ ! -f 3.txt ] || [ 1.txt -nt 3.txt ]; echo $?'
0

그런데 이것이 왜 필요한가? 대시가 이 논리를 선택한 이유는 무엇입니까? 특정 상황에서 대시 로직을 사용하는 것이 타당합니까?

답변1

귀하의 질문은 상당히 독선적이지만, 저는 Dash의 논리가 더 이해가 됩니다. 한 파일이 다른 파일보다 최신인지 비교하려면 두 파일이 모두 있어야 합니다. 그러나 이것은 bash 매뉴얼에서는 분명히 그렇지 않습니다.

6.4 Bash 조건식

파일1-nt 파일2

file1이 file2보다 최신이거나(수정 날짜 기준) file1이 존재하고 file2가 없는 경우 참입니다.

대시 매뉴얼 페이지

파일1-nt 파일2

file1과 file2가 존재하고 file1이 file2보다 최신이면 참입니다.


이것이 왜 필요한가요?

두 파일이 모두 존재해야 하는 이유는 무엇입니까? 더 좋은 질문은 왜 안 되느냐는 것입니다. 존재하지 않는 파일보다 최신인지 확인하기 위해 file1을 비교하는 이유는 무엇입니까? 이는 file1이 존재하는지 테스트하는 정교한 방법일 뿐입니다. 한 파일이 다른 파일보다 최신인지 비교하려는 경우 파일 중 하나가 누락되면 오류가 발생할 수 있습니다.


다른 비교 연산자와 관련이 있습니까?

존재하지 않는 파일과 파일을 비교하는 것은 정수를 null 값과 비교하는 것과 비슷합니다. 그것이 [[ 1 -gt "" ]]사실로 평가된다면 말이 되나요? bash는 이것이 또한 의미가 있다고 생각합니다 ...

$ bash -c '[[ 1 -gt "" ]] && echo yes'
yes
$ dash -c '[ 1 -gt "" ] && echo yes'
dash: 1: [: Illegal number:
$ sh -c '[ 1 -gt "" ] && echo yes'
sh: line 0: [: : integer expression expected

관련 정보