¿Cómo soluciono la advertencia: sustitución del comando: byte nulo ignorado en la entrada?


12

Tengo una secuencia de comandos que se ejecuta que necesita usar notify-send, pero se ejecuta como root. Lo único que encontré que funciona es este script . El problema es que en esta línea:

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

Sigo recibiendo el error

warning: command substitution: ignored null byte in input

¿Cómo soluciono o elimino el mensaje de error?
Por cierto, lo siguiente no lo suprime:

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

Respuestas:


15

Esta advertencia parece ser una nueva característica en Bash-4.4; consulte, por ejemplo , la sustitución de comandos con bytes nulos genera una advertencia .

Una opción sería quitar o convertir el byte nulo en su tubería, por ejemplo

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

(tenga en cuenta que cambié a la $(. . .)forma moderna de sustitución de comandos, en lugar de backticks).

Alternativamente, puede usar el readcomando incorporado de bash shell , que puede tratar con delimitadores nulos directamente, por ejemplo

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

(divida la salida grep delimitada por nulos en dos tokens separados por el =carácter; asigne el primero a la variable basura _y el segundo a DBUS_SESSION).

[Realmente no pude probar esto ya que no tengo una versión adecuada de bash]


tr -d '\0'También está bien?
Konard
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.