Jak naprawić ostrzeżenie: podstawienie polecenia: zignorowano bajt zerowy na wejściu?

12

Mam skrypt, który działa, który musi korzystać z funkcji send-send, ale działa jako root. Jedyne, co znalazłem, które działa, to ten skrypt . Problem polega na tym, że na tej linii:

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

Wciąż pojawia się błąd

warning: command substitution: ignored null byte in input

Jak naprawić lub ukryć komunikat o błędzie?
Nawiasem mówiąc, nie tłumią tego:

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

źródło

Odpowiedzi:

15

To ostrzeżenie wydaje się być nową funkcją w Bash-4.4 - patrz na przykład zastępowanie poleceń pustymi bajtami generuje ostrzeżenie .

Jedną z opcji byłoby usunięcie lub konwersja bajtu zerowego w potoku np

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

(zauważ, że $(. . .)zamiast backticków przerzuciłem się na nowoczesną formę zastępowania poleceń).

Alternatywnie, możesz użyć wbudowanego readpolecenia powłoki bash , które może bezpośrednio poradzić sobie z ogranicznikami zerowymi, np

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

(podziel wyjście grep rozdzielone znakiem null na dwa tokeny oddzielone =znakiem; przypisz pierwszą zmienną śmieciową, _a drugą - DBUS_SESSION).

[Naprawdę nie mogłem ich przetestować, ponieważ nie mam odpowiednio nowej wersji bash]

steeldriver
źródło
Jest tr -d '\0'również w porządku?
Konard