引用符のないファイルでは、どの文字をエスケープする必要がありますか?


12

bashコマンドを実行するブラウザベースのシェル/ターミナルがあり、スペースをエスケープしていますが、括弧もエスケープする必要があることがわかりました。引用符で囲まれていないファイル名をエスケープする必要がある他の文字は何ですか?


あなたが何をしようとしているのかはまったく明確ではありません。そして、オートコンプリートは何と関係がありますか?
マイケルヴェール2017

@MichaelVehrs私はmv filename filename-foobashでコマンドを使用していますが、スペースと括弧の他に、どの文字をエスケープする必要がありますか?
jcubic 2017

@MichaelVehrsがオートコンプリートの言及を削除しました。
jcubic 2017

基本的に、空白、シェルグロブ、履歴イベントなどのすべてのシェルメタキャラクター。このため、個々の文字をエスケープするのではなく、ファイル名全体を引用する必要がありますmv "$filename" "$newname"
Michael Vehrs 2017

@MichaelVehrs私は引用がエスケープで問題を解決することを知っていますが、引用なしのファイル名を使用する必要があります。私はターミナルエミュレータを使用していますが、ユーザーが引用符を使用しなくても機能するはずです。
jcubic 2017

回答:


22

単純な解決策は'、最初に単一引用符()を置き、最後に別の単一引用符を置き'、ファイル名内のすべての文字を4文字のシーケンスで置き換えること'\''です。文字列'の終わりを示す文字以外のすべての文字は、単一引用符で囲まれた文字列内では特別な意味を失います。シーケンス'\''は一重引用符付きリテラルを終了し、直後に引用符付き一重引用符が続き、新しい一重引用符付きリテラルを開きます。したがって、ファイル名

This file's name has some weird characters!
Will you manage to escape them?

次のように引用できます。

somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'

二重引用符にはより複雑なエスケープルールがあり!、履歴置換が有効になっている場合は感嘆符を含めることができないため、これ以上は取り上げません。

別のアプローチは、バックスラッシュで文字を保護することです。これは、改行を除くすべての文字で機能します。改行の場合、単一引用符(または二重引用符)で囲むことが唯一の解決策です。引用符で囲まれた名前をユーザーに提示するためにバックスラッシュの数を最小限にしたい場合は、バックスラッシュが必要な場所に制限することができます。ただし、省略したバックスラッシュが多いほど、必要なものを忘れるリスクが高くなります。文字、数字、ASCII以外の文字は常に使用できます。不明な場合は、空白や句読点を引用してください。

典型的なシェル(ksh、bashまたはzsh)では、少なくともいくつかの状況では、次の文字を引用符で囲む必要があります。

  • 空白(スペース、タブ、改行—改行はバックスラッシュで引用できないことに注意)。
  • ! —履歴の拡張。
  • " —シェル構文。
  • #-コメントの前に空白がある場合、コメントが始まります。zshワイルドカード。
  • $ —シェル構文。
  • & —シェル構文。
  • ' —シェル構文。
  • (—単語の途中でも:ksh拡張グロブ(bashおよびzshでも利用可能); zshワイルドカード。
  • )(を参照(
  • * — shワイルドカード。
  • , —ブレースの内側のみ。
  • ; —シェル構文。
  • < —シェル構文。
  • = — zshで、ファイル名の先頭にある場合(PATHルックアップによるファイル名展開)。
  • > —シェル構文。
  • ? — shワイルドカード。
  • [ — shワイルドカード。
  • \ —シェル構文。
  • ] —引用符を付けずに済む場合があります。
  • ^—履歴の拡張。zshワイルドカード。
  • ` —シェル構文。
  • { —ブレース拡張。
  • | —シェル構文。
  • } — zshでエスケープする必要があります。対応する開始ブレースがない場合、他のシェルはより寛容です。
  • ~—ファイル名の先頭にある場合のホームディレクトリの展開。zshワイルドカード。それが最後の文字であるときは常に安全です。

さらにいくつかの文字が特別な処理を必要とする場合があります:

  • -はシェルにとって特別なものではありませんが、コマンド引数の先頭にあるときはオプションを示します。特別な処理はシェルではなくコマンドで行われるため、引用符で保護することはできません。で始まるファイル名を保護するために、その前に-置くことができます。./これにより、同じファイルのままですが、引数が-もう始まりません。
  • .それ自体は特別ではありませんが、ドットファイルは*デフォルトでグロブから除外されます。
  • :はシェルにとって特別ではありませんが、一部のコマンドはそれを特別に解析します。たとえば、リモートファイル(hostname:filename)を示します。コロンを含むファイル名に対処する方法については、コマンドのドキュメントを参照してください。

¹ ユーザーは代替履歴展開文字を設定している場合を除き。一部のシェルではこれが可能です。これは、バックスラッシュではなく単一引用符を使用するもう1つの理由です。


LF一部のシェルでは、少なくとも改行のみをバックスラッシュで引用できます。
iBug 2017

@iBugいいえ。shのようなシェルでは、backslash + newlineは改行ではなく空の文字列に展開されます。
Gilles「SO-邪悪なことをやめなさい」

これは良い答えです、ありがとう。この情報が「公式に」入手できる場所へのリンクはありますか?
slashmais 2017

1
@slashmaisどんな情報?シェル言語の構文は、さまざまなマニュアルや仕様で「公式」に利用できますが、そこから、引用が必要な文字を正確に見つけるまでは、完全に簡単ではありません。
Gilles「SO-邪悪なことをやめる」

1
私もこれを見つけました:tecmint.com/manage-linux-filenames-with-special-characters-リストほどコンパクトではありませんが、多くの例があります。(by-the-by:「どんな情報?」というトピックが登場人物に関する場合、クールな反応ではありません)
スラッシュマイズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.