如何修复警告:命令替换:忽略输入中的空字节?

如何修复警告:命令替换:忽略输入中的空字节?

我有一个运行的脚本需要使用通知发送,但以 root 身份运行。我发现唯一有效的方法是这个脚本。问题在于这一行:

DBUS_SESSION=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/$DBUS_PID/environ | sed -e s/DBUS_SESSION_BUS_ADDRESS=//`

我一直收到错误

warning: command substitution: ignored null byte in input

我该如何修复或隐藏错误消息?
顺便说一句,以下方法无法隐藏它:

2> /dev/null
> /dev/null
>> /dev/null
> /dev/null 2>&1
2>&1

答案1

此警告似乎是 Bash-4.4 中的新功能 - 例如参见使用空字节替换命令会生成警告

一种选择是去除或转换管道中的空字节,例如

DBUS_SESSION=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$DBUS_PID/environ | tr '\0' '\n' | sed -e s/DBUS_SESSION_BUS_ADDRESS=//)

(请注意,我切换到现代$(. . .)形式的命令替换,代替反引号)。

或者,您可以使用 bash shell 的内置read命令,它可以直接处理空分隔符,例如

IFS== read -d '' _ DBUS_SESSION < <(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$DBUS_PID/environ)

(将以空分隔的 grep 输出拆分为两个由字符分隔的标记=;将第一个分配给垃圾变量_,将第二个分配给DBUS_SESSION)。

[我无法真正测试这些,因为我没有合适的最新版本的 bash]

相关内容