Bagaimana cara memperbaiki peringatan: substitusi perintah: diabaikan byte nol dalam input?

12

Saya memiliki skrip yang menjalankan yang perlu menggunakan notify-send, tetapi dijalankan sebagai root. Satu-satunya hal yang saya temukan yang berfungsi adalah skrip ini . Masalahnya adalah pada baris ini:

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

Saya terus mendapatkan kesalahan

warning: command substitution: ignored null byte in input

Bagaimana cara saya memperbaiki atau menekan pesan kesalahan?
By the way, berikut ini tidak menekannya:

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

sumber

Jawaban:

15

Peringatan ini tampaknya menjadi fitur baru di Bash-4.4 - lihat misalnya Substitusi perintah dengan null byte menghasilkan peringatan .

Salah satu opsi adalah melepas atau mengonversi byte nol di dalam pipa Anda misalnya

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

(perhatikan bahwa saya beralih ke $(. . .)bentuk substitusi perintah modern , menggantikan backtick).

Atau, Anda bisa menggunakan readperintah builtin bash shell , yang dapat menangani pembatas nol secara langsung, misalnya

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

(pisahkan output grep yang dibatasi-nol menjadi dua token yang dipisahkan oleh =karakter; tetapkan yang pertama ke variabel sampah _dan yang kedua ke DBUS_SESSION).

[Aku tidak bisa benar-benar menguji ini karena aku tidak memiliki versi bash yang sesuai baru-baru ini]

Steeldriver
sumber
Apakah tr -d '\0'juga ok?
Konard