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

15 command-line bash scripts

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

DBUS_SESSION=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/$DBUS_PID/environ | sed -e s/DBUS_SESSION_BUS_ADDRESS=//`
Run Code Online (Sandbox Code Playgroud)

我不断收到错误

warning: command substitution: ignored null byte in input
Run Code Online (Sandbox Code Playgroud)

如何修复或抑制错误消息?
顺便说一句,以下内容不会压制它:

2> /dev/null
> /dev/null
>> /dev/null
> /dev/null 2>&1
2>&1
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 17

此警告似乎是 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=//)
Run Code Online (Sandbox Code Playgroud)

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

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

IFS== read -d '' _ DBUS_SESSION < <(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$DBUS_PID/environ)
Run Code Online (Sandbox Code Playgroud)

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

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