
При установке $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 нет ничего особенного, это произошло бы для любого определения переменной или для любой команды в этом отношении, если у вас есть *
где-то в двойных кавычках само по себе, оно будет заменено списком файлов (не начинающихся с .
!) в текущем каталоге (если текущий каталог не пуст или не содержит только файлы, начинающиеся с .
, в этом случае *
останется как есть).