Ответ 1
Не совсем проблема с экранированием bash
, она scp
обрабатывает x:
как префикс [user @] хоста, попробуйте:
scp ./file:\ name.mp4 [email protected]:"/path/to/dest"
Использование относительных (например, ./
) или полностью определенных путей (/path/to/source
) предотвращает это поведение - наличие /
до :
заставляет OpenSSH прекратить проверку возможных host:
или [email protected]:
префикс). OpenSSH scp
только имена файлов особых случаев, которые начинаются с двоеточия, позволяя этим работать без проблем, не имеют поддержки для ускорения :
в нормальном смысле и не имеют другого представления о допустимых именах хостов, поэтому почти любое имя файла с :
может вызвать это.
(Из-за упрощенного анализа OpenSSH адресов []
с закрытыми адресами IPv6 вы можете успешно scp
файлы, содержащие :
, которые начинаются с [
или содержат @[
до :
и не содержат ]:
, но это обычно не полезно; -)
( Приведенный ниже текст был написан, когда оригинальный вопрос: Как избежать двоеточия в bash? Это относится к этому ситуации, но не до scp
, поскольку никакое количество экранирования оболочки не поможет там.)
Чтобы ответить на вопрос о том, как избежать :
, вам не нужно, но работает "\:
". Места, в которых используется :
:
- нулевая команда
:
, не нужно бежать, хотя вы можете, просто как\e\c\h\o foo
, она не влияет на команду ( "no effect" не полностью прав, если вы избежите одного или нескольких символов, это будет предотвратить совпадение псевдонима) -
PATH
(и другие,CDPATH
,MAILPATH
), избегая значений, не имеет никакого полезного эффекта (я не смог запустить программу в своем PATH из каталога, содержащего:
, что немного неожиданный) - расширение параметра
${name:-x}
и более,name
должно быть[a-zA-Z_][a-zA-Z0-9_]
, поэтому не нужно избегать имен переменных, и поскольку нет никакой двусмысленности, нет необходимости избегать последующих:
в других вариантах расширения параметров -
? :
trinary работает только с переменными и числами, не нужно бежать -
==
и=~
с классами в шаблоне, например[[:digit:]]
, вы можете выйти с помощью\:
, но я не понимаю, как это может быть полезно... - в именах команд или функций, не нужно бежать,
\:
не имеет никакого полезного эффекта
(Обратите внимание, что нулевая команда просто :
, вы можете иметь команду или функцию с именем ":foo
" и ее можно вызывать без экранирования, в этом отношении она отличается от #
, где команда с именем #foo
должен быть экранирован.)