我有一个运行需要使用通知发送的脚本,但以 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]