smbstatusの結果をシェルスクリプト変数にインポートする方法

smbstatusの結果をシェルスクリプト変数にインポートする方法

smbstatusコマンドラインから実行すると、次の結果が表示されます。

❯ smbstatus

Samba version 4.17.3
PID     Username     Group        Machine                                   Protocol Version  Encryption           Signing
----------------------------------------------------------------------------------------------------------------------------------------

Service      pid     Machine       Connected at                     Encryption   Signing
---------------------------------------------------------------------------------------------

No locked files

ただし、次のスクリプトに同じ種類のコマンドを配置すると、次のようになります。

#!/usr/bin/bash

SMB_STATUS="$(smbstatus)"

echo "Result: $SMB_STATUS"

次のメッセージが表示されます。

No locked files
Result:
Samba version 4.17.3
PID     Username     Group        Machine                                   Protocol Version  Encryption           Signing
----------------------------------------------------------------------------------------------------------------------------------------

Service      pid     Machine       Connected at                     Encryption   Signing
---------------------------------------------------------------------------------------------

実際には「ロックファイルなし」行をフィルタリングしようとしていますが、バックグラウンドで2つのプロセスが実行されているように見えるため、シェルスクリプトではこれを実行できないようです。わかりません。私がここで見ていることをどのように説明するのかわかりません。

ベストアンサー1

この奇妙な動作を見たときに最初に考えたのは、それが別々の出力ストリームであるということです。 stderrとstdoutのいずれかを削除してそれを確認できます。

smbstatus > /dev/null

そして

smbstatus 2> /dev/null

私はあなたが違いを見たようです: smbstatusprint session id("PID username group...")(源泉)と接続(「サービスpidマシン...」)(源泉)到着標準出力「ロックされたファイル」テキストが印刷されるとき標準エラー源泉)。 「ファイルロック」テキストがstdoutからstderrに変更されました。今回提出してください2022年8月8日samba-4.17.0rc1。

送信プログラムがバッファをフラッシュしたりファイルハンドルを閉じたりしない限り、画面(またはシェルを介してキャプチャされた出力$( ... ))が最初にstdoutを見るのか、stderrを最初に見るのかは任意です。これはsmbstatusが何をしているのか見たことがありません。

「ロックファイルなし」行があるかどうかをフィルタリングするには、次の方法を使用することをお勧めします。標準エラーストリーム(stderr)をどのようにgrepしますか?:

# in shells that support process substitution such as bash, zsh, or ksh93u+
if smbstatus > /dev/null 2>(grep -qF 'No locked files')
then
   # ...
fi

または

if smbstatus 2>&1 1>/dev/null | grep -qf 'No locked files'
then
   # ...
fi

おすすめ記事