POSIX 테스트 및 -a


9

checkbashisms 로 내 스크립트를 확인 하고 다음 경고가 표시되었습니다.

possible bashism in check_ssl_cert line 821 (test -a/-o):
if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then

에서 는 POSIX 사양의 섹션 4.62.4 I 찾기

primary -a primary 바이너리와 primary 및 primary의 결과를 수행합니다. -a 연산자는 -o 연산자보다 우선합니다.

-a-o비 휴대용 고려?

답변:


11

이식성이 좋지는 않지만 [4 개 이상의 인수를 전달했을 때 신뢰할 수있는 구현은 없습니다 .

bash에서도 :

$ ALTNAMES='='  bash -c '[ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ]'
bash: line 0: [: too many arguments

관련 섹션은 다음과 같습니다.

> 4 개의 인수 :

결과는 지정되어 있지 않습니다.

[OB XSI] [옵션 시작] XSI 호환 시스템에서 기본 및 연산자 조합은 앞에서 설명한 우선 순위 및 연관성 규칙을 사용하여 평가해야합니다. 또한 문자열 비교 이진 프라이 머리 '='및 "! ="는 모든 단항 프라이 머리보다 우선 순위가 높습니다. [옵션 끝]

-a-o금지되어야한다. 올바른 방법은 &&|| 연산자를 대신 사용하는 것입니다.

if [ -n "$foo" ] && [ -n "$bar" ]; then

나는 심지어 더 읽기 쉽다.


고마워, 유일한 해결책은 두 가지 테스트를하는 것입니까? `if [-n "$ {ALTNAMES}"] && [-n "$ {COMMON_NAME}];
Matteo

3
하지 하나 그러나 확실하게 최고의 대체 권장 -a하고-o
스테판 Chazelas가

감사합니다 (단일 테스트를 할 수있는 방법이 없다는 것을 의미합니다 ...).
Matteo

1
네, 가능합니다 [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](여전히 POSIX에 따라 지정되지 않았지만 휴대 가능하고 신뢰할 수 있음). 또는[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
Stéphane Chazelas

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.