web-dev-qa-db-ja.com

対話型のzshコマンドでコメントを許可する

zshのように、コマンドラインで記述されたbashコマンドでコメントを許可すると便利な場合がありますが、

% echo test # test
zsh: bad pattern: #

bashシェルと同じ動作をする方法はありますか?

3
Toothrot
$ setopt interactive_comments
$ echo hello # comment
hello

zshシェルは、スクリプト(一般的に非インタラクティブシェル)でinteractive_commentsシェルオプションをデフォルトで有効にしますが、インタラクティブセッションを実行するときは有効にしません。

zshマニュアルの関連ビット:

COMMENTS
       In non-interactive shells, or in interactive shells with the
       INTERACTIVE_COMMENTS option set, a Word beginning with the third
       character of the histchars parameter (`#' by default) causes that Word
       and all the following characters up to a newline to be ignored.

このShellオプションを設定しないと、bad pattern Shellオプションが設定されている場合にのみextended_globエラーが発生します。 extended_globを設定すると、x#は0個以上のパターンxに一致し、x##は1つ以上のパターンxに一致します(これらは対応します)正規表現修飾子*および+)に変更します。つまり、extended_globセットおよびinteractive_commentsnsetを使用すると、シェルは、知らないうちに使用した拡張ファイル名グロビングパターン修飾子で使用されている構文について文句を言っています。


histcharsの値はデフォルトで!^#であり、最初の2文字は履歴の展開で使用されます。

zshのコメントは$histchars[3]で区切られているため、この文字を変更すると、コメントと見なされるテキストが変更されます。

$ setopt extended_glob
$ echo hello # hello : hello
zsh: bad pattern: #
$ unsetopt extended_glob
$ echo hello # hello : hello
hello # hello : hello
$ setopt interactive_comments
$ echo hello # hello : hello
hello
$ histchars[3]=:
$ echo hello # hello : hello
hello # hello

興味深いことに(?)、bashシェルにはinteractive_commentsシェルオプションもありますが、これはインタラクティブシェルではデフォルトでオンになっています。

$ echo hello # hello
hello
$ shopt -u interactive_comments
$ echo hello # hello
hello # hello
9
Kusalananda