제가 생각할 수 있는 사용 사례는 -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 매뉴얼에서는 분명히 그렇지 않습니다.
파일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