Bash가 grep 결과에 따라 "인수 너무 많음" 오류를 표시합니까?

Bash가 grep 결과에 따라 "인수 너무 많음" 오류를 표시합니까?

그래서 저는 기계에 배터리가 있는지 확인한 다음, 배터리 유무에 따라 다른 명령을 실행하려고 합니다. 이것이 내가 지금까지 가지고 있는 것입니다:

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

그러나 예상대로 BAT0이 /tmp/batstat에 기록되지 않으면 "bash: [:Too Many Arguments" 오류가 반환됩니다. 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/batstat확실히 test내장된 조건식이 아닙니다(아름다운 매뉴얼에 자세히 설명되어 있습니다) bash. 의 출력이 grep사용되지 않으므로 -q옵션 및 종속 종료 코드로 충분할 수 있습니다.

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

게다가 /tmp/batstat이는 매우 잘못된 선택이 될 수 있으며, 특히 악의적인 로컬 사용자가 액세스할 수 있는 경우 더욱 그렇습니다. 대신 사용해 보세요.mktemp(1), 또는 아래에서 파일을 찾을 수 없습니다 /tmp.

관련 정보