如何将 smbstatus 的结果获取到 shell 脚本变量中

如何将 smbstatus 的结果获取到 shell 脚本变量中

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

相关内容