bash
エスケープの問題ではありません。[user@]ホストプレフィックスとしてscp
扱われます。次のことを試してください。x:
scp ./file:\ name.mp4 user@host:"/path/to/dest"
相対パス(例./
)または完全修飾パス(/path/to/source
)を使用すると、この動作が防止されます。/
前に存在すると、OpenSSHは可能性のあるプレフィックス:
のチェックを停止します)。host:
user@host:
OpenSSHのscp
唯一の特殊なケースのファイル名はコロンで始まり、問題なく機能します。通常の意味でのエスケープはサポートされておらず:
、有効なホスト名の他の概念もありません。そのため、aを含むほとんどすべてのファイル名:
がこれ(または同等のもの)を引き起こす可能性があります。[
]
以前に見つかった場合のIPv6の動作:
)。
これは他のプログラムにも影響を与える可能性があります。たとえばrsync
、同じ回避策がそこに適用されます。
(OpenSSHは[]
囲まれたIPv6アドレスを単純に解析するため、で始まるファイル、またはの前に含まれるファイルと含まれないscp
ファイルを正常にファイルできますが、これは一般的には役に立ちません;-):
[
@[
:
]:
(以下のテキストは、元の質問が「bashでコロンをエスケープするにはどうすればよいですか?」というときに書かれたものです。これはその状況に当てはまりますがscp
、シェルのエスケープの量が役に立たないためではありません。)
脱出方法についての質問に答える:
必要はありませんが、「\:
」は機能します。aが使用されている場所:
:
- nullコマンド
:
、エスケープする必要はありませんが、コマンドに影響を与えないのと同じよう\e\c\h\o foo
に、エスケープする必要はありません(「効果なし」は完全に真ではありません。1つ以上の文字をエスケープすると、エイリアスの一致が妨げられます。エイリアス:
)
PATH
(およびその他CDPATH
、、 )値をエスケープしても有用な効果はありません(少し予期しないことですが、をMAILPATH
含むディレクトリからPATHでプログラムを実行できませんでした):
- パラメータ展開
${name:-x}
などは、であるname
必要があります[a-zA-Z_][a-zA-Z0-9_]
。したがって、変数名をエスケープする必要はありません。また、あいまいさがないため:
、パラメータ展開の他のバリエーションで後続にエスケープする必要もありません。
? :
trinaryは変数と数値のみを操作し、エスケープする必要はありません
==
=~
のようなパターンのクラスを使用すると、[[:digit:]]
で逃げることができますが、それ\:
がどのように役立つかについて私は途方に暮れています...
- コマンド名または関数名内では、エスケープする必要
\:
はなく、有用な効果はありません
(nullコマンドは単なる:
、「」のような名前のコマンドまたは関数を持つことが:foo
でき、エスケープせずに呼び出すことができます。この点で#
、名前の付いたコマンド#foo
をエスケープする必要がある場所とは異なります。)