Условное сопоставление шаблонов регулярных выражений в сценарии оболочки korn

Вы напортачили со сценариями запуска вашей оболочки входа в систему, и это сбивает с толку scp.

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

Весь этот таинственный вывод является результатом команд в сценариях запуска вашей оболочки, выводящих различные управляющие последовательности OSC(␛[и ␛/являющиеся псевдонимами ECMA -48 7 -битов для управляющих символов OSC и ST )и последовательности управления CSI (␛], являющиеся псевдонимом битов ECMA -48 7 -для управляющего символа CSI ). Эти последовательности пытаются изменить сопоставление цветов и повлиять на обратную прокрутку терминала. Они работают только с определенным эмулятором терминала.

Но локальный конец вашего SSH-соединения не является чем-то, что отражает все это на вашем локальном терминале (, который, учитывая, что вы используете MacOS, вряд ли будет этим конкретным эмулятором терминала и, скорее всего, будет чем-то вроде iTerm2, в любом случае ). Это локальная программа scp, которая должна говорить по специализированному протоколу через SSH-соединение, которое реализует механизм копирования файлов. Весь хлам, который сценарии запуска вашей оболочки ошибочно выплевывают даже в не-интерактивном режиме , смешивает его коммуникации.

Исправьте ошибочные сценарии запуска оболочки, чтобы они не не пытались выполнять операции с терминалом, когда они вызываются не -интерактивно или без управляющего терминала.

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

1
22.07.2020, 20:17
1 ответ
  1. Ваш grep не настроен на тихий grep. Если бы было совпадение, оно было бы выведено, а вы этого не хотите. Поэтому добавьте опцию -q, чтобы подавить вывод grepпри совпадении.
  2. +является частью расширенных регулярных выражений (ERE ). Чтобы активировать их, вам нужен флаг -Eдля grep. В противном случае +рассматривается как буквальный символ, и поэтому 40и 50не совпадают в вашей первоначальной попытке.
  3. Неверный синтаксис expr.

Если исправить эти моменты, сценарий станет:

#!/usr/bin/ksh
arg1=$1
arg2=$2

if echo "$arg1" | grep -Eq '^[0-9]+$' && echo "$arg2" | grep -Eq '^[0-9]+$'
then
    expr "$arg1" + "$arg2"
else
    echo "$arg1 and $arg2"
fi

Тем не менее, это занимает много круговых развязок и exprне рекомендуется. Более прямой подход

#!/usr/bin/ksh
arg1=$1
arg2=$2

case "$arg1$arg2" in
    *[!0-9]*) echo "$arg1 and $arg2";;
    *) echo "$((arg1+arg2))";;
esac

caseпроверяет, содержат ли объединенные $arg1и $arg2цифры, отличные от -. Если да, они повторяются без изменений. В противном случае вычисляется их сумма.

1
18.03.2021, 23:18

Теги

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