Miałem dziwne zachowanie dziś rano w terminalu bash:
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
- Pierwsze polecenie zostało wklejone ze skryptu edytowanego za pomocą gedit.
- Drugi wpisano bezpośrednio w terminalu.
Po pewnym kopaniu dowiaduję się, że usunięcie 30-tego znaku (spacja między klientem.conf a „]”) i zastąpienie go spacją sprawiło, że polecenie znów działało.
Moje założenie było słuszne: nieznana pusta postać wpadła do komendy , ale pytanie brzmi:
- Jak mogę ujawnić te znaki w terminalu, aby móc debugować polecenie? I co ważniejsze:
- Jak mogę temu zapobiec?
BTW, mam system Ubuntu 18.04 / francuski, skrypt, z którego wklejam polecenie, znajduje się na dysku USB i mógł być edytowany także w systemie Windows.
Dziękuję za bardzo dobre odpowiedzi. Zły znak to znak UTF-8, który nie łamie c2 a0 . Pytanie, jak usunąć specjalną postać „M-BM-” za pomocą sed, ma interesujący fakt na temat tej postaci.
Dziwne jest to, że skrypt nie zawiera tej postaci. Więc nie wiem skąd się wziął.
history 2|xxd
(ponieważ history
samo polecenie jest zawsze ostatnie na liście), lub wpisz history|grep "CommandWithProblem"|xxd
. Zamiast tego możesz użyć dowolnego innego programu do wyświetlania szesnastkowego xxd
, ale domyślnie jest to format, który mi się podoba.
set -x
. To pokaże ci polecenie i jak jest podzielone. To niekoniecznie oznaczałoby „zły charakter tutaj”, ale pokazywałoby, że bash nie dzielił się z tą postacią.