나는 다음 문장을 보았다 if
.
if [ -f <file path> -size +0 ]
-f
파일이 존재하는지 확인하는 방법을 알고 있지만 -size +0
여기서는 무엇을 합니까?
매뉴얼 페이지에서 도움을 얻을 수 없었고 포럼 검색도 시도했는데 도움이 되는 내용을 찾고 싶었습니다.
답변1
이는 잘못된 것일 가능성이 높습니다. 이 양식은 표준 유틸리티(그리고 비어 있지 않은 파일을 의미) -size +0
에는 유효 하지만 (일명 . 스크립트 작성자가 적절한 컨텍스트를 유지하지 않고 이를 재사용한 것으로 보입니다. 그렇다면 다음 사항을 확인해야 합니다.find
test
[
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를 포함하여 유사한 동작을 갖습니다.