Comment puis-je corriger l'avertissement: substitution de commande: octet nul ignoré en entrée?

12

J'ai un script qui s'exécute qui doit utiliser notify-send, mais qui s'exécute en tant que root. La seule chose que j'ai trouvée qui fonctionne est ce script . Le problème est que sur cette ligne:

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

Je reçois toujours l'erreur

warning: command substitution: ignored null byte in input

Comment corriger ou supprimer le message d'erreur?
Au fait, ce qui suit ne le supprime pas:

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

la source

Réponses:

15

Cet avertissement semble être une nouvelle fonctionnalité de Bash-4.4 - voir par exemple La substitution de commandes avec des octets nuls génère un avertissement .

Une option serait de supprimer ou de convertir l'octet nul dans votre pipeline, par exemple

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

(notez que je suis passé à la $(. . .)forme moderne de substitution de commandes, à la place des backticks).

Alternativement, vous pouvez utiliser la readcommande intégrée du shell bash , qui peut traiter directement les délimiteurs nuls, par exemple

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

(divisez la sortie grep délimitée par des valeurs nulles en deux jetons séparés par le =caractère; affectez la première à la variable indésirable _et la seconde à DBUS_SESSION).

[Je n'ai pas vraiment pu les tester car je n'ai pas de version récente de bash convenable]

tournevis
la source
Est-ce que ça va tr -d '\0'aussi?
Konard