Wie behebe ich die Warnung: Befehlsersetzung: Nullbyte bei der Eingabe ignoriert?

11

Ich habe ein Skript, das ausgeführt wird und notify-send verwenden muss, aber als root ausgeführt wird. Das einzige, was ich gefunden habe, das funktioniert, ist dieses Skript . Das Problem ist, dass in dieser Zeile:

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

Ich bekomme immer wieder den Fehler

warning: command substitution: ignored null byte in input

Wie behebe oder unterdrücke ich die Fehlermeldung?
Übrigens: Folgendes wird nicht unterdrückt:

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

quelle

Antworten:

14

Diese Warnung scheint eine neue Funktion in Bash-4.4 zu sein - siehe zum Beispiel Die Befehlsersetzung durch Null-Bytes generiert eine Warnung .

Eine Möglichkeit wäre, das Null-Byte in Ihrer Pipeline zu entfernen oder zu konvertieren, z

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

(Beachten Sie, dass ich $(. . .)anstelle von Backticks auf die moderne Form der Befehlsersetzung umgestellt habe).

Alternativ können Sie den eingebauten readBefehl der Bash-Shell verwenden , der sich direkt mit Nulltrennzeichen befassen kann, z

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

(Teilen Sie die durch Nullen getrennte Grep-Ausgabe in zwei durch das =Zeichen getrennte Token auf . Weisen Sie die erste der Junk-Variablen _und die zweite der Junk-Variablen zu. DBUS_SESSION)

[Ich konnte diese nicht wirklich testen, da ich keine entsprechend aktuelle Version von Bash habe]

Steeldriver
quelle