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