Ошибка Bash?? Когда настройка `$HISTIGNORE` заканчивается на `SP`+`*` или `SP`+`?*`

Ошибка Bash?? Когда настройка `$HISTIGNORE` заканчивается на `SP`+`*` или `SP`+`?*`

При установке $HISTIGNOREокончания SP+ *или SP+ ?*списки файлов в текущей папке будут объединены с его значением.

Неважно, extglobустановлено или нет.

Пример NG (текущая папка содержит только один файл «do_music.sh»):

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

ОК Пример:

$ 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в это место.

Если бы у вас был файл с именем eg bla:sudo, то он *:sudoтакже был бы заменен на this. Этого не происходит, потому что ни один файл не соответствует этому шаблону.

Чтобы этого не произошло, необходимо использовать одинарные кавычки, чтобы избежать любых *замен:

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

Обновлять

Кстати, в HISTIGNORE нет ничего особенного, это произошло бы для любого определения переменной или для любой команды в этом отношении, если у вас есть *где-то в двойных кавычках само по себе, оно будет заменено списком файлов (не начинающихся с .!) в текущем каталоге (если текущий каталог не пуст или не содержит только файлы, начинающиеся с ., в этом случае *останется как есть).

Связанный контент