Làm cách nào để sửa cảnh báo: thay thế lệnh: bỏ qua null byte trong đầu vào?


12

Tôi có một tập lệnh chạy cần sử dụng thông báo gửi, nhưng chạy dưới quyền root. Điều duy nhất tôi thấy rằng hoạt động là kịch bản này . Vấn đề là trên dòng này:

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

Tôi liên tục nhận được lỗi

warning: command substitution: ignored null byte in input

Làm cách nào để sửa hoặc chặn thông báo lỗi?
Bằng cách này, sau đây không đàn áp nó:

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

Câu trả lời:


15

Cảnh báo này dường như là một tính năng mới trong Bash-4.4 - xem ví dụ Thay thế lệnh bằng byte rỗng tạo cảnh báo .

Một tùy chọn sẽ là loại bỏ hoặc chuyển đổi byte null trong đường ống của bạn, vd

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

(lưu ý rằng tôi đã chuyển sang $(. . .)hình thức thay thế lệnh hiện đại , thay cho backticks).

Ngoài ra, bạn có thể sử dụng readlệnh dựng sẵn của bash shell , có thể xử lý trực tiếp với các dấu phân cách null

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

(chia đầu ra grep được phân tách bằng null thành hai mã thông báo được phân tách bằng =ký tự; gán biến đầu tiên cho biến rác _và biến thứ hai thành DBUS_SESSION).

[Tôi thực sự không thể kiểm tra những thứ này vì tôi không có phiên bản bash gần đây phù hợp]


tr -d '\0'cũng ok?
Konard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.