사용 가능한 소프트웨어 업데이트를 알려주는 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
이는 명령이 터미널에 인쇄하는 기본 파일 설명자입니다.