"-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)"

Выполнение переменных в bash часто приводит к сбоям. Просто невозможно написать функцию run_this , которая правильно обрабатывает все крайние случаи, например:

  • конвейеры (например, ls | grep filename )
  • перенаправления ввода / вывода (например, ls> / dev / null )
  • операторы оболочки, такие как if while и т. Д.

Если все, что вы хотите сделать, это избегать повторения кода, вам лучше выключить с помощью функций. Например, вместо:

run_this(){
    "$@"
}
command="ls -l"
...
run_this "$command"

вы должны написать

command() {
    ls -l
}
...
command

Если команды доступны только во время выполнения, вы должны использовать eval , который специально разработан для обработки всех причуд, которые сделают run_this сбой:

command="ls -l | grep filename > /dev/null"
...
eval "$command"

Обратите внимание, что eval известен проблемами безопасности, но если вы передадите переменные из ненадежных источников в run_this , вы получите также сталкиваются с выполнением произвольного кода.

5
13.04.2017, 15:36
2 ответа

Что делает ваш терминал

«Прямоугольники с числами в [них]» - это способ, которым ваш эмулятор терминала отображает вам последовательность управления терминалом, потому что он не распознает эту последовательность. В частности:

  • Существует управляющий символ ECMA-48 (в группе C1, для технических) с именем Команда операционной системы , сокращенно OSC. Он имеет значение Unicode U + 009D.
  • ECMA-48 определяет механизм, в котором символы в группе C1, для передачи которых требуется полностью чистый 8-битный канал связи, могут быть представлены управляющей последовательностью, в которой используются только символы со значениями меньше U + 0080. (128). Эти 7-битные псевдонимы позволяют использовать управляющие символы C1 на путях передачи, которые не являются 8-битными чистыми. По иронии судьбы, на протяжении десятилетий мир был в основном 8-битным.

    Скорее всего, вы знаете один из этих 7-битных псевдонимов, который очень распространен: ESC [ вместо управляющего символа CSI (U + 009B). Управляющий символ OSC имеет 7-битный псевдоним ESC ] .

  • Что-то на дальнем конце вашего SSH-соединения ожидает, что ваш терминал поймет управляющие последовательности, которые начинаются с OSC.Он передает их с использованием 7-битного псевдонима.
  • Ваш терминал не полностью поддерживает ECMA-48. Он видит ESC ] и обрабатывает его как символ ESC, за которым следует символ ] . И это то, что он печатает.
  • Но на нем нет символа для символа ESC. Таким образом, он возвращается к традиционному трюку отображения символов, для которых у него нет глифа, в виде поля с шестнадцатеричным значением (младшие 16 бит) кодовой точки Unicode в нем. Если вы присмотритесь, вы увидите числа 00 и 1B в поле для U + 001B, кодовой точки для символа ESC.
  • Он также неправильно обрабатывает «интервал» того, что он напечатал для ESC, то есть пространство, которое он занимает на экране, который на самом деле составляет два символа шириной. Таким образом, после печати коробки положение вывода недостаточно . Затем он печатает ] поверх правой половины поля, как вы можете видеть.

Почему было сказано сделать это

Несколько эмуляторов терминала распознают OSC как средство представления последовательности управляющих символов. Для этого есть даже стандартная форма. В п. 5.6 стандарта ECMA-48 определены «строки управления», начинающиеся с OSC и заканчивающиеся с помощью ST (U + 009C, String Terminator ). Что такое в , строка управления зависит от типа терминала. Например: из документа вы увидите, что xterm реализует такие управляющие строки для установки шрифтов и заголовков окон.

Однако форма управляющей последовательности в этом случае не является формой xterm. Скорее, это

␛]1337;CurrentDir=/home/patrick␇

. Это форма управляющих последовательностей OSC, которую понимает iTerm2. iTerm2 определяет набор управляющих последовательностей, представленных OSC, которые явно нестандартны и специфичны для iTerm2.Они не соответствуют спецификации управляющей строки ECMA-48, но завершают управляющую строку с помощью BEL ​​(U + 0007), а не с ST, как указано в стандарте. Строго говоря, это управляющая строка, которая никогда не завершается , поскольку в содержимом управляющей строки разрешены любые символы, кроме SOS и ST; и тот, который с совместимым эмулятором терминала фактически просто останавливает отображение, поскольку терминал просто накапливает весь дальнейший вывод в виде строки управления.

(Эмулятор терминала, встроенный в ядро ​​Linux, также не реализует стандартные строки управления OSC. В xterm doco отмечается, что он имеет средства для поддержки неработающих приложений, использующих несовместимый эмулятор терминала ядра Linux или формы iTerm2 Форма здесь определенно принадлежит iTerm2, а не эмулятору терминала ядра Linux.)

Когда вы используете iTerm2 со своего Macintosh, все, что находится на другом конце SSH-соединения, незаметно отправляет управляющие последовательности iTerm2 на ваш эмулятор терминала, чтобы сообщить ему такие вещи, как ваша оболочка, ваш рабочий каталог, кто вы, когда вы начинаете редактирование в приглашении оболочки, когда вы начинаете выполнять команду и т. д.

В удаленной системе вы жестко подключили тип терминала . Вы заставили его работать в предположении, что вы всегда разговариваете с ним с помощью iTerm2. Но вы сейчас разговариваете с ним, используя Terminator, работающий в Ubuntu, другом эмуляторе терминала, который имеет другой набор управляющих последовательностей.

Фактически, выходные данные даже говорят вам следующее:

␛]1337;ShellIntegrationVersion=2;shell=bash␇

Вы установили iTerm2 «Интеграция оболочки» для оболочки Bourne Again в своей удаленной системе. Глядя на это, довольно плохо проверять, что iTerm2 на самом деле является терминалом, с которым он разговаривает.

Так что отключите / удалите его.

Дополнительная литература

  • Функции управления для наборов кодированных символов . ECMA-48. ECMA International.
  • console_codes . Справочные страницы Linux. § 4. 2015.
  • Мэтью Фриман, Джордж Нахман и Джеймс А. Розен. Запатентованные коды выхода . Документация iTerm2.
  • Мэтью Фриман, Джордж Нахман и Джеймс А. Розен. Интеграция оболочки . Документация iTerm2.
11
27.01.2020, 20:34

Попробуйте поставить перед командой sshдругой префикс LC_ALL, например.

LC_ALL=C ssh dummy@server
3
27.01.2020, 20:34

Теги

Похожие вопросы