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

これは、コマンドが端末に印刷するデフォルトのファイル記述子です。

関連情報