Как исправить предупреждение: подстановка команды: игнорируется нулевой байт при вводе?

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

источник

Ответы:

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=//)

(обратите внимание, что я переключился на современную $(. . .)форму подстановки команд, вместо кавычек).

В качестве альтернативы вы можете использовать встроенную readкоманду оболочки bash , которая может напрямую работать с нулевыми разделителями, например

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

(разделите вывод grep с разделителями, равными нулю, на два токена, разделенных =символом; присвойте первый переменной junk, _а второй - DBUS_SESSION).

[Я не мог проверить это, потому что у меня нет подходящей версии bash]

steeldriver
источник
Тоже tr -d '\0'нормально?
Конард