У меня было такое странное поведение этим утром в терминале 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
- Первая команда была вставлена из скрипта, отредактированного с помощью gedit.
- Второй был набран прямо в терминале.
После некоторых копаний я обнаружил, что удаление 30-го символа (пробел между client.conf и "]") и замена его пробелом снова заставили команду работать.
Мое предположение было верным: неизвестный пустой символ проскользнул в команду , но вопрос таков:
- Как я могу показать эти символы в терминале, чтобы я мог отладить команду? И более важно:
- Как я могу предотвратить это снова?
Кстати, я использую Ubuntu 18.04 / французский язык, скрипт, с которого я вставляю команду, находится на USB-накопителе и, возможно, также был отредактирован в Windows.
Спасибо за ваши очень хорошие ответы. Плохой символ - это неразрывный пробел c2 a0 UTF-8. Вопрос Как удалить специальный символ 'M-BM-' с помощью sed имеет интересный факт об этом персонаже.
Странно то, что сценарий свободен от этого персонажа. Так что я не знаю, откуда это.
history 2|xxd
(потому что history
сама команда всегда является последней в списке), либо введите history|grep "CommandWithProblem"|xxd
. Вы можете использовать любую другую программу шестнадцатеричного отображения вместо xxd
, но по умолчанию это формат, который мне нравится.
set -x
. Это покажет вам команду и как она разделена. Это не обязательно говорит «плохой персонаж здесь», но показывает, что bash не разделяется на этого персонажа.