如何解决警告:命令替换:在输入中忽略了空字节?


12

我有一个运行的脚本,该脚本需要使用notify-send,但以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

Answers:


15

该警告似乎是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)

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

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


是否tr -d '\0'还好吗?
Konard
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.