Вы напортачили со сценариями запуска вашей оболочки входа в систему, и это сбивает с толку scp
.
scp
запускает не -интерактивный сеанс SSH и вызывает не -интерактивную оболочку входа без управляющего терминала. Но сценарии запуска вашей оболочки не проверяют этот случай должным образом и делают то, что они делают для интерактивных оболочек, запущенных с управляющим терминалом. Действительно, эти оболочки беспечно и ошибочно предполагают , что терминал относится к определенному типу терминала.
Весь этот таинственный вывод является результатом команд в сценариях запуска вашей оболочки, выводящих различные управляющие последовательности OSC(␛[
и ␛/
являющиеся псевдонимами ECMA -48 7 -битов для управляющих символов OSC и ST )и последовательности управления CSI (␛]
, являющиеся псевдонимом битов ECMA -48 7 -для управляющего символа CSI ). Эти последовательности пытаются изменить сопоставление цветов и повлиять на обратную прокрутку терминала. Они работают только с определенным эмулятором терминала.
Но локальный конец вашего SSH-соединения не является чем-то, что отражает все это на вашем локальном терминале (, который, учитывая, что вы используете MacOS, вряд ли будет этим конкретным эмулятором терминала и, скорее всего, будет чем-то вроде iTerm2, в любом случае ). Это локальная программа scp
, которая должна говорить по специализированному протоколу через SSH-соединение, которое реализует механизм копирования файлов. Весь хлам, который сценарии запуска вашей оболочки ошибочно выплевывают даже в не-интерактивном режиме , смешивает его коммуникации.
Исправьте ошибочные сценарии запуска оболочки, чтобы они не не пытались выполнять операции с терминалом, когда они вызываются не -интерактивно или без управляющего терминала.
-q
, чтобы подавить вывод grep
при совпадении. +
является частью расширенных регулярных выражений (ERE ). Чтобы активировать их, вам нужен флаг -E
для grep. В противном случае +
рассматривается как буквальный символ, и поэтому 40
и 50
не совпадают в вашей первоначальной попытке. 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
цифры, отличные от -. Если да, они повторяются без изменений. В противном случае вычисляется их сумма.