Bash のバグ?? `$HISTIGNORE` の設定が `SP`+`*` または `SP`+`?*` で終わる場合

Bash のバグ?? `$HISTIGNORE` の設定が `SP`+`*` または `SP`+`?*` で終わる場合

+または+$HISTIGNOREで終わる設定の場合、現在のフォルダー内のファイルのリストがその値に連結されます。SP*SP?*

extglob設定または未設定は問いません。

NG 例 (現在のフォルダーには 'do_music.sh' というファイルが 1 つだけあります):

$ export HISTIGNORE="ls:ls *:history:history *:sudo *"
$ echo $HISTIGNORE
ls:ls *:history:history *:sudo do_music.sh
$

OK 例:

$ export HISTIGNORE="ls:ls *:history *:sudo *:history"
$ echo $HISTIGNORE
ls:ls *:history *:sudo *:history
$

答え1

アップデート2

私の最初の回答のとおり、 を*そのままにしておくには一重引用符を使用する必要があります。 そうすると、変数にHISTIGNOREは のみが含まれ*、展開は含まれません。 を使用するとecho、シェルが$HISTIGNOREを に置き換えて*からファイル リストに置き換えるため、展開が行われていることがわかります。

env | grep HISTIGNORE両方のケースで を実行して確認できます。 "-case では が表示されdo_music.sh'-case では が表示されます*

また、export HISTIGNOREあるディレクトリで行を実行し、別のディレクトリで行を実行すると、使用するかecho使用しないかによって違いがわかります。'"

(上記の部分は誤りであることが判明したため削除しました。*二重引用符内でも置換されていないため、一重引用符と二重引用符の両方が機能するはずです)。

アップデート3

このような動作になる理由はecho、bash での置換の順序によるものです。マニュアルによると、次のようになります。

       The  order of expansions is: brace expansion; tilde expansion, parameter and vari‐
       able expansion, arithmetic expansion, and command substitution (done in a left-to-
       right fashion); word splitting; and pathname expansion.

まず最初に起こるのはパラメータ/変数拡大($HISTIGNOREへの変化*)が起こり、その後にパス名拡張(*ファイルのリストへの変更)。

元の回答は以下

最初の行を実行すると:

export HISTIGNORE="ls:ls *:history:history *:sudo *"

シェルはすでに最後の部分を*ディレクトリ内のファイルのリストに展開しているので、do_music.shその場所に到達していることになります。

たとえば、という名前のファイルがあった場合bla:sudo*:sudoもこれによって置き換えられます。そのパターンに一致するファイルがないため、置き換えられません。

これを回避するには、*置換を避けるために一重引用符を使用する必要があります。

export HISTIGNORE='ls:ls *:history:history *:sudo *'

アップデート

ちなみに、HISTIGNORE については何も特別なことはありません。これは、任意の変数定義、または任意のコマンドで発生します。*二重引用符内のどこかに が単独で存在する場合、現在のディレクトリ内のファイルの一覧 ( で始まっていないもの) に置き換えられます.(現在のディレクトリが空の場合、または で始まるファイルのみが含まれている場合を除きます。.その場合、 は*そのまま残ります)。

関連情報