Tôi đã có hành vi kỳ lạ sáng nay trong một bash terminal:
user@home:/home/user$ [ -f /etc/openvpn/client.conf ] && echo true
bash: [: missing «]»
user@home:/home/user$ [ -f /etc/openvpn/client.conf ] && echo true
true
- Lệnh đầu tiên đã được dán từ một tập lệnh được chỉnh sửa bằng gedit.
- Cái thứ hai được gõ trực tiếp trong thiết bị đầu cuối.
Sau khi đào bới, tôi phát hiện ra rằng việc xóa ký tự thứ 30 (khoảng trắng giữa client.conf và "]") và thay thế nó bằng một khoảng trắng làm cho lệnh hoạt động trở lại.
Giả định của tôi là đúng: một ký tự trống không xác định đã trượt vào lệnh , nhưng câu hỏi là:
- Làm thế nào tôi có thể tiết lộ các ký tự trong thiết bị đầu cuối để tôi có thể gỡ lỗi lệnh? Và quan trọng hơn:
- Làm thế nào tôi có thể ngăn chặn điều này xảy ra một lần nữa?
BTW, tôi chạy Ubuntu 18.04 / ngôn ngữ tiếng Pháp, tập lệnh mà tôi dán lệnh từ trong ổ USB và có thể cũng đã được chỉnh sửa trên Windows.
Cảm ơn bạn cho câu trả lời rất tốt của bạn. Ký tự xấu là ký tự UTF-8 không gian không phá vỡ c2 a0 . Câu hỏi Làm thế nào để loại bỏ ký tự 'M-BM-' đặc biệt với sed có một sự thật thú vị về nhân vật đó.
Điều kỳ lạ là kịch bản không có nhân vật này. Vì vậy, tôi không biết nó đến từ đâu.
history 2|xxd
(vì history
chính lệnh luôn luôn là cuối cùng trong danh sách) hoặc gõ history|grep "CommandWithProblem"|xxd
. Bạn có thể sử dụng bất kỳ chương trình hiển thị hex nào khác thay thế xxd
, nhưng điều này mặc định là định dạng tôi thích.
set -x
. Điều này sẽ cho bạn thấy lệnh và cách phân chia. Nó không nhất thiết phải nói "nhân vật xấu ở đây", nhưng nó sẽ cho bạn thấy rằng bash không phân chia nhân vật đó.