[ -t /tmp -o -f /tmp ]가 "너무 많은 인수"를 던지는 이유는 무엇입니까?

[ -t /tmp -o -f /tmp ]가 "너무 많은 인수"를 던지는 이유는 무엇입니까?

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설정되지 않았기 때문에 $tmp0으로 처리되어 결과적으로 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

관련 정보