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
私はあなたが違いを見たようです: smbstatus
print 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