bashコマンドを実行するブラウザベースのシェル/ターミナルがあり、スペースをエスケープしていますが、括弧もエスケープする必要があることがわかりました。引用符で囲まれていないファイル名をエスケープする必要がある他の文字は何ですか?
mv filename filename-foo
bashでコマンドを使用していますが、スペースと括弧の他に、どの文字をエスケープする必要がありますか?
mv "$filename" "$newname"
。
bashコマンドを実行するブラウザベースのシェル/ターミナルがあり、スペースをエスケープしていますが、括弧もエスケープする必要があることがわかりました。引用符で囲まれていないファイル名をエスケープする必要がある他の文字は何ですか?
mv filename filename-foo
bashでコマンドを使用していますが、スペースと括弧の他に、どの文字をエスケープする必要がありますか?
mv "$filename" "$newname"
。
回答:
単純な解決策は'
、最初に単一引用符()を置き、最後に別の単一引用符を置き'
、ファイル名内のすべての文字を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
一部のシェルでは、少なくとも改行のみをバックスラッシュで引用できます。