web-dev-qa-db-ja.com

アンパサンドを含むサブディレクトリ名をエスケープするにはどうすればよいですか?

Kornshellを実行し、ディレクトリツリーをトラバースしようとしています。次の名前のサブディレクトリにcdしたいとします。

 -3ab_&_-3dc.img

私の質問は、この名前のアンパサンドをどのようにエスケープする必要があるのですか?二重引用符とバックスラッシュのさまざまな組み合わせを試しましたが、成功しませんでした。

9
RCinICT

&(または他のほとんどすべての文字)には、2つの単純な可能性があります。

  • 全体を一重引用符で囲みます:' -3ab_&_-3dc.img'
  • 問題のある各文字の前にバックスラッシュを置きます:-3ab_\&_-3dc.img

2つの例外があります。

  • 単一引用符メソッドは、単一引用符に対しては機能しません。バックスラッシュは一重引用符内では特別なものではないため、直接使用することもできません。できることは、単一引用符で囲まれた文字列を終了し、すぐにバックスラッシュと単一引用符を使用して、単一引用符を再起動することです。たとえば、ディレクトリの名前がfoo'bar\quxの場合:cd 'foo'\''bar\qux'。そのように覚えておくことができます。単一引用符内では、'\''は単一引用符を取得します。
  • バックスラッシュメソッドは、改行に対しては機能しません。バックスラッシュ-改行は無視されます。改行を一重引用符で囲む必要があります。

二重引用符も使用できますが、その場合は一部の文字の前にバックスラッシュを置く必要があります。単一引用符はより簡単です。

ここには、ディレクトリの名前がダッシュで始まるという、もう1つの問題があります。その文字は、オプションが続くことを(ほとんどすべてのコマンドと同様に)cdコマンドに伝えます。ダッシュはシェルに特別なものではなく、コマンドに固有なので、引用符はシェルに影響しません。オプションとして解釈せずに、ダッシュで始まる引数をコマンドに渡す方法は2つあります。

  • この議論を表現する別の方法を見つけてください。ファイル名の場合、先頭に./を追加しても、同じファイルを指定します。
  • 引数--を前に置きます。これは、オプションの検索を停止するようにコマンドに指示します。

そこで、このサブディレクトリに変更する方法をいくつか紹介します。

cd -- '-3ab_&_-3dc.img'
cd -- -3ab_\&_-3dc.img
cd ./-3ab_\&_-3dc.img
cd './-3ab_&_-3dc.img'

アンパサンドはエスケープする必要がありますが、アンパサンドではなく先頭の-に問題がある可能性があります。先頭の-により、cdはオプションを渡していると考えさせました。これを回避するには、./を使用します。

cd './-3ab_&_-3dc.img'
5
jordanm