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


