![如何将 smbstatus 的结果获取到 shell 脚本变量中](https://linux22.com/image/214298/%E5%A6%82%E4%BD%95%E5%B0%86%20smbstatus%20%E7%9A%84%E7%BB%93%E6%9E%9C%E8%8E%B7%E5%8F%96%E5%88%B0%20shell%20%E8%84%9A%E6%9C%AC%E5%8F%98%E9%87%8F%E4%B8%AD.png)
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
---------------------------------------------------------------------------------------------
我实际上正在尝试过滤“无锁定文件”行,但是我似乎无法在 shell 脚本中执行此操作,因为似乎可能有两个进程正在后台运行?我不知道。我不知道如何解释我在这里所看到的。
答案1
当我看到这样的奇怪行为时,我的第一个想法是它们是单独的输出流。您可以通过删除 stderr 和 stdout 之一来确认这一点:
smbstatus > /dev/null
和
smbstatus 2> /dev/null
我认为您已经看到了这种差异:smbstatus
打印会话 ID(“PID 用户名组...”)(来源)和连接(“服务 pid 机器...”)(来源) 到标准输出当它打印“锁定文件”文本时标准错误(来源)。 “锁定文件”文本从 stdout 更改为 stderr这次提交2022 年 8 月 8 日在 samba-4.17.0rc1 中。
无论您的屏幕(或通过 shell 捕获输出$( ... )
)首先看到 stdout 还是首先看到 stderr 都是任意的,除非发送程序刷新缓冲区或关闭文件句柄,而我没有看到 smbstatus 这样做。
要过滤“无锁定文件”行的存在,我建议使用以下方法如何grep标准错误流(stderr)?:
# 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