grep 결과를 기반으로 하면 Bash에서 "인수가 너무 많습니다" 오류가 발생합니까?

grep 결과를 기반으로 하면 Bash에서 "인수가 너무 많습니다" 오류가 발생합니까?

그래서 나는 기계에 배터리가 있는지 확인한 다음, 배터리가 있는지 여부에 따라 다른 명령을 실행하려고 합니다. 지금까지 내가 가진 것은 다음과 같습니다.

upower -d >> /tmp/batstat
if [ grep -F BAT0 /tmp/batstat ]; then
    echo "BAT0 PRESENT" >> /tmp/batstat
else
    echo "NO BAT0" >> /tmp/batstat
fi

그러나 예상대로 /tmp/batstat에 NO BAT0을 쓰는 동안 "bash: [: 너무 많은 인수"라는 오류가 반환됩니다. grep만 실행하면 제대로 작동하는데 왜 if 조건으로 작동하지 않는지 이해할 수 없습니다.

배터리를 확인하는 더 좋은 방법이 있다면 100% 동의합니다.

답변1

if upower -d | grep -qF BAT0 ; then
   echo "BAT0 PRESENT"
else
   echo "NO BAT0"
fi

if일련의 명령을 받아 최종 명령(이 경우 grep)의 상태에 대해 작업합니다. grep일치하면 true를 반환하고 그렇지 않으면 false를 반환합니다.

답변2

grep -F BAT0 /tmp/batstattest의 내장에 대한 조건부 표현(고급 매뉴얼에 자세히 설명되어 있음)이 아닙니다 bash. 의 출력은 grep사용되지 않으므로 -q옵션과 종료 코드에 의존하는 것만으로도 충분할 것입니다.

grep -F -q BAT0 batstat
if [[ $? -eq 0 ]]; then
    echo yea
else
    echo nay
fi

또한 /tmp/batstat특히 사악한 로컬 사용자가 액세스할 수 있는 경우에는 매우 좋지 않은 선택일 수 있습니다. 대신 사용을 고려하십시오.mktemp(1), 또는 아래에서 파일을 찾을 수 없습니다 /tmp.

관련 정보