
Bashコマンドを実行するためのブラウザベースのシェル/ターミナルがあり、スペースをエスケープしていましたが、角かっこもエスケープする必要があることがわかりました。引用符で囲まれていないファイル名に対してエスケープする必要がある他の文字は何ですか?
答え1
簡単な解決策は、先頭に一重引用符('
)を付け、最後に別の一重引用符を入れてから、ファイル'
名の各文字を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)の場合、少なくとも場合によっては次の文字を引用する必要があります。
- 空白(空白、タブ、改行 - 改行はバックスラッシュで引用できないことを忘れないでください)。
!
——歴史的拡張。"
- シェル構文。#
- 前に空白文字があるとコメントが始まります。$
- シェル構文。&
- シェル構文。'
- シェル構文。(
- 単語の途中でも:ksh拡張glob(bashとzshでも使用されます)。)
(望むより(
)*
— sh ワイルドカード。,
- 中かっこ内でのみ拡張されます。;
- シェル構文。<
- シェル構文。=
- 割り当てのように見える場合は、コマンド名(引数ではない)に。また、zshでは、ファイル名の先頭にある(PATH照会によるファイル名の拡張)。>
- シェル構文。?
— sh ワイルドカード。[
— sh ワイルドカード。\
- シェル構文。]
- 引用符を追加しなくても問題を解決できます。^
——歴史拡張。 zshワイルドカード。`
- シェル構文。{
- 拡張をサポートします。|
- シェル構文。}
— zsh からエスケープする必要があり、一致する開かれた括弧がない場合、他のシェルはより寛大です。~
- ホームディレクトリがファイル名の先頭にある場合は拡張、zshワイルドカードは最後の文字の場合は常に安全です。
時には、より多くの文字に特別な処理が必要になることがあります。
-
シェルに特別なものではありませんが、コマンド引数の先頭にある場合はオプションを表します。特別な処理はシェルではなくコマンドにあるため、引用できません。で始まるファイル名を保護するには --
を追加すると、./
ファイル名はまだ同じですが、パラメータはもう起動しません-
。.
それ自体は特別なものではありませんが、*
ドットファイルはデフォルトでglobから除外されます。:
シェルでは特別ではありませんが、一部のコマンドはリモートファイル(hostname:filename
)を表すなど、特別に解析します。コロンを含むファイル名を処理する方法については、このコマンドのマニュアルを参照してください。
1ユーザーが代替履歴拡張文字を構成していない場合。一部のシェルではこれを許可します。これがバックスラッシュの代わりに一重引用符を使用するもう1つの理由です。