Bash 세션 내에서 다음 명령을 성공적으로 실행할 수 있습니다.
[ -e /tmp -o -f /tmp ]
그러나 다음 명령은 오류 메시지와 함께 실패합니다.[: 인수가 너무 많습니다.:
[ -t /tmp -o -f /tmp ]
-e
명령 과 대체가 모두 -t
단항 연산자이고 전체 표현식의 구문을 변경하지 않았기 때문에 두 번째 명령이 실패하는 이유를 설명할 수 없습니다 .
답변1
연산자는 단항 연산자이고 bash에서 숫자가 필요 하지만 -t
(ksh 또는 zsh의 산술 표현식이 아닌) 이것이 수신되는 오류를 설명하지는 않습니다.
이유를 설명하지도 않고 false를 잘못 반환 [ -t /tmp ]
하지도 않습니다 [ X -a -t -a Y ]
.
test
/buildin 코드를 보면 다음과 같은 내용이 [
있다는 것을 알 수 있습니다.거기에 남은 것그 이후로 제거되지 않았으며 POSIX 알고리즘을 따르도록 코드가 업데이트되었습니다 [ -t ]
.[ -t 1 ]
바라보다이 버그 보고서더 알아보기.
또한 바이너리 -a
/ -o
연산자는 다음과 같아야 합니다.아니요사용. POSIX에서는 수십 년 동안 더 이상 사용되지 않았으며 결과적으로 신뢰할 수 없는 테스트 표현식이 생성되었습니다.
사용:
[ -d /tmp ] || [ -f /tmp ]
대신에.
, so 또는 -f
를 암시하는 것은 그다지 의미가 없으며 (심볼릭 링크 확인 후) 존재 여부 를 확인하기 위한 테스트로 작성될 수 있습니다.-e
[ -e /tmp -o -f /tmp ]
[ -e /tmp ] || [ -f /tmp ]
[ -e /tmp ]
/tmp
정기적인파일( -f
) 또는 파일이 아닙니다.
존재하다 zsh
:
$ zsh -c '[ -t /tmp ]'
zsh:1: bad math expression: operand expected at `/tmp'
/tmp
정말 하나잘못된 수학 표현, 이것예상 피연산자연산자 /
가 아닌 나눗셈 수학 연산자를 나타냅니다 .-t
[
$ zsh -c '[ -t foo/tmp ]'
zsh:1: division by zero
이번에는 유효한 수식( foo
변수 나누기 변수)이지만 tmp
설정되지 않았기 때문에 $tmp
0으로 처리되어 결과적으로 0으로 나누기가 됩니다.
$ zsh -o nounset -c '[ -t foo/tmp ]'
zsh:1: tmp: parameter not set
이 nounset
옵션은 초기화되지 않은 변수를 검색하는 데 유용합니다.
$ foo=4 tmp=2 zsh -o nounset -c '[ -t foo/tmp ] &&
printf "fd %d is open on a tty device\n" foo/tmp'
fd 2 is open on a tty device