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