Выполнение переменных в 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
, вы получите также сталкиваются с выполнением произвольного кода.
«Прямоугольники с числами в [них]» - это способ, которым ваш эмулятор терминала отображает вам последовательность управления терминалом, потому что он не распознает эту последовательность. В частности:
Скорее всего, вы знаете один из этих 7-битных псевдонимов, который очень распространен: ESC [
вместо управляющего символа CSI (U + 009B). Управляющий символ OSC имеет 7-битный псевдоним ESC ]
.
]
и обрабатывает его как символ ESC, за которым следует символ ]
. И это то, что он печатает. 00
и 1B
в поле для U + 001B, кодовой точки для символа 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 на самом деле является терминалом, с которым он разговаривает.
Так что отключите / удалите его.
console_codes
. Справочные страницы Linux. § 4. 2015. Попробуйте поставить перед командой ssh
другой префикс LC_ALL
, например.
LC_ALL=C ssh dummy@server