Como faço para corrigir aviso: substituição de comando: ignorado byte nulo na entrada?

12

Eu tenho um script que é executado que precisa usar o envio de notificação, mas é executado como root. A única coisa que achei que funciona é esse script . O problema é que nesta linha:

DBUS_SESSION=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/$DBUS_PID/environ | sed -e s/DBUS_SESSION_BUS_ADDRESS=//`

Eu continuo recebendo o erro

warning: command substitution: ignored null byte in input

Como faço para corrigir ou suprimir a mensagem de erro?
A propósito, o seguinte não o suprime:

2> /dev/null
> /dev/null
>> /dev/null
> /dev/null 2>&1
2>&1

fonte

Respostas:

15

Esse aviso parece ser um novo recurso no Bash-4.4 - veja, por exemplo, Substituição de comando com bytes nulos gera aviso .

Uma opção seria remover ou converter o byte nulo no seu pipeline, por exemplo

DBUS_SESSION=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$DBUS_PID/environ | tr '\0' '\n' | sed -e s/DBUS_SESSION_BUS_ADDRESS=//)

(observe que mudei para a $(. . .)forma moderna de substituição de comando, no lugar de reticulares).

Como alternativa, você pode usar o readcomando interno do bash shell , que pode lidar diretamente com delimitadores nulos, por exemplo,

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

(divida a saída grep delimitada por nulo em dois tokens separados pelo =caractere; atribua a primeira a variável de lixo eletrônico _e a segunda a DBUS_SESSION).

[Eu realmente não pude testar isso porque não tenho uma versão adequadamente recente do bash]

chave de aço
fonte
tr -d '\0'Também está ok?
Konard 04/03