programing

-a 대 -e 옵션 인 경우 bash

goodcopy 2021. 1. 15. 19:17
반응형

-a 대 -e 옵션 인 경우 bash


Bash 문서의 about -a-e옵션 은 다음 같습니다.

-a file
    True if file exists.
-e file
    True if file exists. 

차이점을 얻으려고 다음 스크립트를 실행했습니다.

resin_dir=/Test/Resin_wheleph/Results

if [ -e ${resin_dir} ] ; then
    echo "-e ";
fi

if [ ! -e ${resin_dir} ] ; then
    echo "! -e";
fi

if [ -a ${resin_dir} ] ; then
    echo "-a";
fi

if [ ! -a ${resin_dir} ] ; then
    echo "! -a";
fi

/Test/Resin_wheleph/Results존재하고 디렉토리입니다. 그리고 이것은 내가 얻는 것입니다.

-e
-a
! -a

약간 이상하게 보입니다 (알림 -a! -a). 그러나 if [[ -e ${resin_dir} ]]비슷한 스크립트에서 이중 대괄호 (예 :)를 사용 하면 합리적인 결과를 얻을 수 있습니다.

-e
-a

그래서:

  1. -a-e옵션 의 차이점은 무엇입니까 ?
  2. -a단일 대괄호 안에 사용할 때 이상한 결과가 발생합니까?

나는 조사했고 이것은 꽤 털이 많다.

-a는 더 이상 사용되지 않으므로 /usr/bin/test더 이상 맨 페이지에 나열되지 않지만 여전히 bash에 대한 것입니다. 사용 -e. 단일 '['의 경우 bash 내장은 and와 test동일하게 작동하는 bash 내장 /usr/bin/[동일하게 작동합니다 /usr/bin/test(하나는 다른 하나에 대한 심볼릭 링크 임). 의 효과는 -a위치 따라 다릅니다 file exists. 시작에 있으면을 의미 합니다. 두 표현식의 중간에 있으면 논리적을 의미 and합니다.

[ ! -a /path ] && echo existsbash 매뉴얼에서 그것이 -a이진 연산자로 간주되므로 위의 내용은 a로 파싱되지 않고 (비어 있지 않은) negate -a ..것으로 파싱되므로 작동하지 않습니다 if '!' and '/path' is true. 따라서 스크립트는 항상 출력 "-a"(실제로 파일을 테스트 함)하고 "! -a"실제로 and여기 에서는 바이너리 입니다.

를 들어 [[, -a바이너리로 사용되지 않습니다 and더 이상 ( &&그것의 유일한 목적은 파일을 확인하는 것입니다, 그래서이 사용된다)가 (사용되지 않지만). 그래서 부정은 실제로 당신이 기대하는 것을합니다.


-a테스트 연산자에 대한 ' '옵션은 단항 연산자와 이항 연산자라는 의미를 갖습니다. 이항 연산자로서 'and'연결 (그리고 ' -o'는 'or'연결)입니다. 단항 연산자로서 분명히 파일의 존재를 테스트합니다.

autoconf시스템은 '사용하지 않는 것이 당신을 조언 -a이 혼란을 야기하기 때문에'; 이제 이유를 알 수 있습니다. 실제로 포터블 셸 프로그래밍에서는 조건을 ' &&'또는 ' ||' 와 결합하는 것이 가장 좋습니다 .

@litb가 올바른 방향이라고 생각합니다. ' ! -a ${resin_dir}'가 있으면 Bash는이를 "is the string '!'으로 해석 할 수 있습니다. 비어 있지 않고 '$ {resin_dir}'의 문자열이며 비어 있지 않으며 대답은 yes입니다 .Korn 쉘은 이것에 대해 다른 견해를 가지고 있으며 Bourne 쉘은 또 다른 견해를 가지고 있으므로 ' -a' 에서 멀리 떨어져 있습니다 .

Solaris 10의 경우 :

$ bash -c 'x=""; if [ ! -a "$x" ] ; then echo OK ; else echo Bad; fi'
Bad
$ ksh -c 'x=""; if [ ! -a "$x" ] ; then echo OK ; else echo Bad; fi'
OK
$ sh -c 'x=""; if [ ! -a "$x" ] ; then echo OK ; else echo Bad; fi'
sh: test: argument expected
$

이중 대괄호 [[exp]]는 bash 내장입니다. bash에서 -a와 -e는 아마도 이전 버전과의 호환성을 위해 동일합니다.

단일 대괄호 [exp]는 외부 명령 "test"의 별칭입니다. "test"에서 -a는 논리적 AND입니다. [nothing AND $ STRING]은 (는) 거짓이어야하는 것처럼 보이지만 test에는 몇 가지 구문 문제가 있습니다. 그래서 더 제정신이되는 경향이있는 bash 내장 [[exp]]를 사용하는 것이 좋습니다.

Note: bash really does call /bin/[ when you use "[".

$ [ $UNASIGNED_VAR == "bar" ]
bash: [: ==: unary operator expected

the error shows bash called [. An strace also shows "execve("/usr/bin/[", ..."

ReferenceURL : https://stackoverflow.com/questions/321348/bash-if-a-vs-e-option

반응형