端末にコマンド出力を表示せずにbashスクリプトでコマンド出力に変数を設定するにはどうすればよいですか?

端末にコマンド出力を表示せずにbashスクリプトでコマンド出力に変数を設定するにはどうすればよいですか?

次のスクリプトを実行してみてください。

echo "Is autofs Enabled?"
cmd=`systemctl is-enabled autofs`
echo $cmd
if [[ $cmd = "enabled" ]]; then
echo "Yes autofs is enabled"
elif [[ $cmd = "disabled" ]]; then
echo "No autofs is disabled"
else echo "Autofs not found"
fi

autofsがインストールされていない場合、スクリプトの結果は次のようになります。

Failed to issue method call: No such file or directory
Autofs not found

autofsがインストールされていない場合、予想されるスクリプト出力は次のとおりです。

Autofs not found

「メソッド呼び出しを実行できませんでした:そのファイルまたはディレクトリがありません」を印刷しないようにスクリプトを変更するにはどうすればよいですか?

編集する: みんなありがとうございます。その答えはまさに私が探していたものでした。

答え1

エラーストリームをリダイレクトするのはどうですか/dev/null

[ $(systemctl is-enabled autos 2>/dev/null) = "enabled" ] && echo true || echo false

注:出力を変数に割り当てるときにバックティックを使用することはシェル移植性の最も低い共通分母であり、最新のシェルではコマンドに変数を割り当てることに移行することをお勧めします。$()

答え2

生成されたメッセージ(stdout)systemctlと終了ステータス(後者は$?シェル変数を介して)を確認できます。回避したいエラーメッセージはstderrに渡されるため、これを抑制するにはそのストリームをリダイレクトする必要があります。ゼロ以外の終了ステータスは、デバイスが見つからないか、デバイスが無効になっていることを示します(参照:手動より多くの情報を知りたい場合)。

#!/bin/bash -l    
service=$1
echo "Is $service enabled?"
msg=$(systemctl is-enabled "$service" 2>/dev/null) # capture message
res=$? # capture exit code

if [ -z "$msg" ]; then  # message is empty if service not found
  echo "$service not found"
else  # service could be enabled, disabled, static, etc.
  if [ "$res" -eq 0 ]; then # enabled
    echo "Yes $service is enabled: $msg"
  else
    echo "No, $service is disabled"
  fi
fi

このスクリプトをtmp.shとして保存すると、さまざまな入力でテストできます。

$ ./tmp.sh autofs
    Is autofs enabled?
    Autofs not found
$ ./tmp.sh anacron.timer
    Is anacron.timer enabled?
    Yes anacron.timer is enabled: enabled
$ ./tmp.sh runlevel6.target
    Is runlevel6.target enabled?
    No, runlevel6.target is disabled

caseさまざまな異なるケースを考慮すると、ステートメントを使用してステートをより詳細に処理する方が良い場合があります。

case "$msg" in
    enabled*)  echo "Yes $service is enabled" ;;
    disabled) echo "No, $service is disabled" ;;
    linked*) # etc..
    ;;
    static*) # etc..
    ;;
esac

関連情報