bash 명령 출력 가져오기

bash 명령 출력 가져오기

사용 가능한 소프트웨어 업데이트를 알려주는 macOS용 스크립트를 만들려고 합니다.

result=$(softwareupdate -l)
if [[ $(echo $result) = *"No new software available."* ]]; then say yes;fi

하지만 중요한 라인은 포함되어 있지 않습니다. 결과:

result=$(softwareupdate -l)
softwareupdate -l
++ softwareupdate -l

No new software available.
+ result='Software Update Tool
Finding available software'

if [[ $(echo $result) = *"No new software available."* ]]; then say yes;fi
echo $result
++ echo Software Update Tool Finding available software
+ [[ Software Update Tool Finding available software = *\N\o\ \n\e\w\ \s\o\f\t\w\a\r\e\ \a\v\a\i\l\a\b\l\e\.* ]]

"사용 가능한 새 소프트웨어가 없습니다."라는 줄은 변수에 포함되지 않습니다. 왜?

답변1

출력이 켜져 있기 때문에 STDERR,잘못된 파일 설명자산출.

어떡하지, 결합해STDOUT 그리고 STDERR존재하다 bash:

if softwareupdate -l 2>&1 | grep -q "No new software available"; then
    echo "Nothing to do"
else
    echo "Update available"
fi

대부분의 코드를 유지하고 [[ ]]문자열 일치와 함께 사용하려면 다음을 사용하십시오.

result=$(softwareupdate -l 2>&1)
if [[ $result == *"No new software available"* ]]; then
    [...]

대신 bash 4.0 이상을 사용할 수 있습니다 |&. 2>&1 |macOS의 기본 bash는 지원하기에는 너무 오래되었으므로 를 사용 하거나 최신 bash를 설치 |&해야 합니다 (예: Homebrew 사용).2>&1 |bash

brew install bash

이 코드는부울 논리:

grep 명령이나 다른 명령은 true인 경우 0을 반환하고 false인 경우 > 0을 반환하므로 직접 테스트할 수 있습니다.


STDERR:

이는 명령이 터미널에 인쇄하는 보조 파일 설명자입니다. 기본적으로 구문 분석해서는 안 되는 메시지에 대해 작동합니다. 표준 오류로 리디렉션:>&2

STDIN:

표준 입력은 명령이 입력을 읽을 수 있는 파일 설명자입니다.

STDOUT

이는 명령이 터미널에 인쇄하는 기본 파일 설명자입니다.

관련 정보