플래그를 결합하여 여러 파일 조건을 테스트합니다. 작동합니까?

플래그를 결합하여 여러 파일 조건을 테스트합니다. 작동합니까?

내 거답변StackOverflow는 최소 2개의 찬성표를 받았으며 이전 직장에서 사용했던 워크스테이션 셸에서 실행되었습니다. 해당 워크스테이션에는 SunOS, Red Hat Commercial Linux 또는 Red Hat Enterprise Linux의 이전 버전이 있을 수 있습니다.[[ -fwdpath]]있는지 테스트해 보세요path일반 파일 및 쓰기 가능한 디렉토리로. sh, bash, csh, tcshzsh는 이 워크스테이션에 설치할 수 있는 유일한 쉘이며 아마도 에서 실행할 것입니다 bash.

현재 다른 Unix 계열 운영 체제에서는 이 문제를 재현할 수 없기 때문에 이 질문을 드리는 것입니다. 그것은 항상 나에게문법 오류, 그래서 성공적으로 실행했는지 궁금해지기 시작했습니다.

제 질문은 이 코드가 어떤 시스템에서 작동하는지, 그렇다면 이것이 버그인가요 아니면 기능인가요?입니다.

답변1

아니요, 작동하지 않습니다. 모든 bash 버전에서는 사용할 수 없습니다.

이 테스트는 모든 bash 버전(사실 모든 셸)에서 작동합니다.

$ [ -fwd ] && echo "It worked" || echo "not"
It worked

그러나 파일 플래그를 테스트하지 않고 -fwd문자열 길이가 0인지 테스트합니다. 몇 가지 특성이 있기 때문에 테스트가 정확합니다.

[[변경 허용 플래그를 사용하십시오 .

$ [[ -fwd  ]] && echo "It worked" || echo "not"
b204sh          : /home/user/so: line 3: unexpected argument to conditional unary operator

위의 오류는 bash 3.2에서 bash로 발생합니다.
3.2 이후의 bash 버전에는 버그가 없지만 결과는 true입니다.

$ [[ -fwd ]] && echo "It worked" || echo "not"
It worked

이는 불가능합니다. 디렉토리 항목은 파일( -f)이면서 디렉토리( -d)일 수 없습니다.

이는 테스트가 실제로 문자열을 테스트하고 있다는 생각을 확증해 줍니다.

$ [[ \-fwd ]] && echo "It worked" || echo "not"
It worked

파일로 테스트

$ touch wds
$ [[ -fwd wds ]] && echo "It worked" || echo "not"
bash: conditional binary operator expected
bash: syntax error near `wds'

3.2 이후의 bash 버전에서는 실패 메시지를 표시합니다.
다른 버전의 경우 실제 답변을 제공합니다(파일 테스트에서는 불가능하며 디렉터리 항목은 파일이면서 디렉터리일 수 없습니다).

이 두 테스트를 비교해 보면 첫 글자만 사용된 것 같습니다.

$ b204sh -c '[[ -fd wds ]] && echo "It worked" || echo "not"'
It worked

$ b204sh -c '[[ -df wds ]] && echo "It worked" || echo "not"'
not

아마도 bash 4에서 수정된 버그일 것입니다.

또한 다음과 같은 경우에도 실패합니다.

[[: No match.
[[: Command not found.
unknown condition: -fd# 버전 5.4.2
syntax error at line 3:wds' 예상치 못한` # 버전 AJM 93u+ 2012-08-01

관련 정보