쉘 'test' 명령에서 '-size +0'은 무엇을 의미합니까?

쉘 'test' 명령에서 '-size +0'은 무엇을 의미합니까?

나는 다음 문장을 보았다 if.

if [ -f <file path> -size +0 ]

-f파일이 존재하는지 확인하는 방법을 알고 있지만 -size +0여기서는 무엇을 합니까?

매뉴얼 페이지에서 도움을 얻을 수 없었고 포럼 검색도 시도했는데 도움이 되는 내용을 찾고 싶었습니다.

답변1

이는 잘못된 것일 가능성이 높습니다. 이 양식은 표준 유틸리티(그리고 비어 있지 않은 파일을 의미) -size +0에는 유효 하지만 (일명 . 스크립트 작성자가 적절한 컨텍스트를 유지하지 않고 이를 재사용한 것으로 보입니다. 그렇다면 다음 사항을 확인해야 합니다.findtest[ksh

–s file
    True, if file exists and has size greater than zero.

test또는 스크립트는 내부에 있고 복잡한 구조를 위해 확장된 확장 쉘에서 작동합니다(모르겠어요) . (ksh가 특정 확장 버전입니까?)

답변2

이것은 말이 되지 않습니다.

ksh93단항 연산자에 인수가 너무 많고 단항 연산자가 :로 시작하는 경우 -두 번째 연산자가 인수로 선택되고 나머지는 무시됩니다.

$ ksh -c '[ -f a.out foo bar ] && echo yes'
yes
$ ksh -c '[ -e a.out foo a ] && echo yes'
yes

(두 번째 인수가 가 아닌 -a/-o경우 무시되지 않습니다.)

소스를 확인하세요크쉬 93test이 동작을 확인하세요.

또한 다음을 수행하십시오 strace.

$ { strace -p "$$" & sleep 1; [ -f a.out -size +0 ]; kill "$!"; }
[1] 18467
Process 18455 attached
restart_syscall(<... resuming interrupted call ...>) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("a.out", {st_mode=S_IFREG|0755, st_size=8320, ...}) = 0
kill(18467, SIGTERMProcess 18455 detached
 <detached ...>

Bourne과 같은 다른 쉘은 이 경우 오류를 보고합니다. POSIX는 이 동작을 지정하지 않습니다.


파일이 존재하는지 확인하고 크기가 0보다 큰 경우 표준 셸에 -s테스트 연산자가 있습니다.

[ -s file ] && echo 'file exist and size greater than 0'

ksh88또한 동일하게 행동하십시오. 내 Solaris 10 VM 사용:

$ ksh -c '[ -f a.out foo bar ] && echo yes'
yes
$ strings /usr/bin/ksh | grep -i version
@(#)Version M-11/16/88i

POSIX 이전 셸은 Solaris 10의 Bourne 셸, 가보인 Bourne 셸, Schily osh 및 Schily sh를 포함하여 유사한 동작을 갖습니다.

관련 정보