追加読書

追加読書

shoptZshで代わりに使用しようとしているときに思い出させるために、setopt次のエイリアスを作成し、まずシェルプロンプトでテストしました。

$ alias shopt='echo "You\'re looking for setopt. This is Z shell, man, not Bash."'

外部一重引用符が内部二重引用符と一致し、アポストロフィがエスケープされていますが、次を使用して閉じる引用符を完成するように求められます。

dquote > _

どうなりますか?

エスケープが無視されているか、複数のレイヤーの解釈のためにデュアルエスケープが必要なようです...だから、この理論をテストするために、次のようにデュアルエスケープ(およびトリプルエスケープなど)を試しました。

alias shopt='echo "You\\\\\\\\\\\\\\\\\\\\\\'re looking for setopt. This is Z shell, man, not Bash." '

そしていいえ他の動作を確認してください。これは私には理解できません。どのような奇妙な魔法がシェルが私が期待したように動作するのを防ぎますか?

実際の解決策は、echo実際には何も必要としないため、引用符を使用せずに二重引用符を使用し、テキストを編集するときに無視されるaliasようにアポストロフィをエスケープすることです。echoそれではみんな実際問題は消えます。

助けてください?この混乱した問題を解決する必要があります。

ベストアンサー1

これでzshはないfish

zsh(とで)cshすべてのBourneのようなシェルのように一重引用符は、エスケープのない強い引用符です。rcquotes以下のオプションを使用しない限り@JdeBP ヒント引用符1)をzshシミュレートしますrc。一重引用符で囲まれた文字列の中に一重引用符を使用することはできません。まず、一重引用符で囲まれた文字列を閉じ、別の引用メカニズム(\または)を使用して"リテラル一重引用符を入力する必要があります。

alias shopt='echo "You'\''re looking for setopt. This is Z shell, man, not Bash."'

または:

alias shopt='echo "You'"'"'re looking for setopt. This is Z shell, man, not Bash."'

次のようにすることもできます。

alias shopt="echo \"You're looking for setopt. This is Z shell, man, not Bash.\""

"..."はい弱い\(ここでは埋め込み文字をエスケープするために使用されます)を含む引用符の中のいくつかの文字は"まだ特別です。

または:

alias shopt=$'echo "You\'re looking for setopt. This is Z shell, man, not Bash."'

(エスケープできる$'...'ksh93への別の参照)'\'

(BTW、in.のset -o代わりに標準を使用することもできます。歴史的な理由から、2つのオプションセットがあります。1つは設定用です。他のほとんどのシェルと同様に、オプションセットは1つだけです。setoptzshbashset -oshoptzsh


1 `rc`では、Plan9シェルにはUnixに似たバージョンもあります。 [一重引用符が唯一の引用メカニズムです](/a/296147)(バックスラッシュと二重引用符は一般的な文字です)、唯一の方法はEnter literal Singleです。 rcquotes"を使用すると、次のようにできます。
alias shopt = 'echo "setoptを探しています。これはBashではなくZシェルです。"'

おすすめ記事