![zsh関数の出力から先行スペースが削除されます。](https://linux33.com/image/59153/zsh%E9%96%A2%E6%95%B0%E3%81%AE%E5%87%BA%E5%8A%9B%E3%81%8B%E3%82%89%E5%85%88%E8%A1%8C%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82.png)
次の2つのコマンドとその結果を考えてみましょう。
14:57 : echo $(echo " ABC")
ABC
14:57 : echo " ABC"
ABC
zshバージョン:zsh 5.0.5 (x86_64-apple-darwin14.0)
もともと先行スペースが削除されるのはなぜですか?ドキュメントに説明や理由が見つかりません。
答え1
明らかにするコマンドの置き換えIFS
コマンド置換を二重引用符で囲まない限り、from文字を区切り文字として単語に区切ります。したがって、" ABC"
1つの要素を含む単語のリストに分割されます"ABC"
。echo "$(echo " ABC")"
コマンド置換結果を文字列として使用するために使用されます。
通常のBourne / POSIXスタイルのシェルとは異なり、zshはコマンド置換によって生成された単語をファイルリストではなくglobパターン:echo $(echo "*")
printsとして扱いません(このオプションが設定されていない場合)。また、一般的なBourne / POSIXスタイルのシェルとは異なり、パーティション化は、引用符で囲まれていない変数置換によって生成されたスペースが削除されない限り、引用符で囲まれていない変数置換ではなく、引用符付きコマンド置換でのみ行われます。*
glob_subst
答え2
なぜならecho ABC
、andはecho ABC
同じ出力を提供し、ABC
最初のコマンドはecho $(echo " ABC")
==> echo ABC
==>であるからですABC
。シェルは複数のスペースを削除するため、echo
コマンドラインにスペースがいくつあるかさえわかりません。
次のように、式全体を引用してスペースを保存できます。
$ echo "$(echo " ABC")"
ABC
または
$ echo "$(echo ' ABC')"
ABC