존재하다코드 검토

존재하다코드 검토

존재하다코드 검토

누군가 구조를 다음과 같이 바꿔야 한다고 지적했습니다 test.

[ ! -f "$1" ] &&
print_error_and_exit "The given argument is not an existing file."

구체적으로 다음과 같습니다.

[ ! -e "$1" ] ...

test -e하지만 info test이것 외에는 어떤 정보도 찾을 수 없습니다. 관련 장 인용:

16.3.3 File characteristic tests
--------------------------------

‘-e FILE’
     True if FILE exists.

16.3.1 File type tests
----------------------

‘-f FILE’
     True if FILE exists and is a regular file.

질문

test내가 하고 있는 일을 100% 이해하고 싶기 때문에 이 두 명령의 차이점과 사용법에 대한 더 자세한 설명을 요청할 수 있습니까 ?

답변1

일부 "파일"은 실제로 디렉터리( -d), FIFO( -p), 장치 노드( -b-c) 등입니다. 존재하지만 일반 파일은 아닙니다.

답변2

이건 내 댓글인 것 같다!

-e디렉터리, 파이프, 소켓, 장치 등 비정규 파일에 대해 테스트하면 true가 반환됩니다.

심볼릭 링크는 특별한 경우입니다. test일반적으로 다음을 사용합니다 .뾰족한링크 자체가 아닌 파일입니다( test -L, 일명 제외 test -h).

인용된 댓글에서 당신은가능한FIFO에서 데이터를 읽을 수 있기를 원합니다. (반면에 디렉토리에서 읽는 것은 확실히 작동하지 않습니다.)

나중에 댓글 보면 정말아니요장치를 덮어쓰려고 합니다(FIFO에 쓰고 싶을 수도 있으므로 필요에 따라 미세 조정).

답변3

이미 존재하는 이름으로 디렉터리 항목을 생성하지 않기 위해 테스트를 사용하고 있으므로 해당 항목이 이미 존재하고 가능하다면 항목이 무엇인지(일반 파일, 디렉터리, FIFO, 장치 노드 등)는 중요하지 않습니다. (이름이 이미 사용되었기 때문에) 생성되지 않습니다.

-f테스트는 "일반 파일"만 감지합니다. -e다른 유형을 감지합니다 .

이것은 귀하의 의도에 더 가깝습니다.

[ -e "$output_filename" ] && 
    print_error_and_exit 6 "Destination file name exists."

그러나 -e링크는 감지하지 않습니다. 다음 구성을 사용해야 합니다.

[ -e "$output_filename" ] || [ -L "$output_filename" ] && 
    print_error_and_exit 6 "Destination file name exists."

관련 정보