Come posso correggere avvertimento: sostituzione comando: ignorato byte nullo nell'input?


12

Ho uno script che viene eseguito che deve utilizzare Notify-Send, ma funziona come root. L'unica cosa che ho scoperto che funziona è questo script . Il problema è che su questa linea:

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

Continuo a ricevere l'errore

warning: command substitution: ignored null byte in input

Come riparo o sopprimo il messaggio di errore?
A proposito, ciò che segue non lo sopprime:

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

Risposte:


15

Questo avviso sembra essere una nuova funzionalità in Bash-4.4 - vedere ad esempio la sostituzione di comando con byte null genera un avviso .

Un'opzione sarebbe quella di eliminare o convertire il byte null nella pipeline, ad es

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

(nota che sono passato alla moderna $(. . .)forma di sostituzione dei comandi, al posto dei backtick).

In alternativa, è possibile utilizzare il readcomando incorporato della shell bash , che può gestire direttamente i delimitatori null, ad es

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

(dividere l'output grep delimitato da null in due token separati dal =carattere; assegnare il primo alla variabile junk _e il secondo a DBUS_SESSION).

[Non sono riuscito a testarli perché non ho una versione di Bash abbastanza recente]


Va tr -d '\0'anche bene?
Konard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.