Почему подстановка истории bash по-прежнему включена по умолчанию?

Я думаю, вы слишком все усложняете. Чтобы найти строку fooво всех файлах, расположенных в текущем каталоге и подкаталогах, просто запустите

grep -r "foo" *

По умолчанию grep выводит совпадающую строку, к которой добавляется имя файла, в котором она была найдена.

Следующее вместо этого выведет только имя файла без соответствующей строки:

grep -rl "foo" *
17
27.04.2018, 14:02
3 ответа

Если вы уже знакомы с bash, то работа с шаблонами подстановки истории не намного утомительнее, чем работа с любыми другими символами, специфичными для этой оболочки. Однако, если кто-то не знаком с оболочкой или просто никогда не использовал ее функции подстановки истории, очевидно, будет сюрпризом, когда ее сработают кажущиеся безобидными строки без кавычек или двойные -кавычки.

В интерактивной оболочке с включенной подстановкой истории символ !является специальным почти так же, как и символ $, т. е. везде, если только он не экранирован с помощью \или в одинарных -кавычках..

В отличие от $сквозных, подстановки истории не расширяются в здесь -документах, и, поскольку они ориентированы на строку -, они дополнительно будут происходить в строках, в которых подстановка попадает в контекст без кавычек или контекст с двойными кавычками (в этой строке при отдельном сканировании ). Дополнительную информацию см. в этом отчете об ошибке .

Подстановка истории отключена в сценариях, не -интерактивных оболочек (), потому что там не нужна возможность истории команд оболочки, а не потому, что эта функция имеет «серьезные проблемы». В сценарии сохранение каждой команды в $HISTFILEне имеет смысла, и подстановка истории также не является чем-то, на что вы хотели бы полагаться в сценарии.

Должен ли он быть включен по умолчанию или нет в интерактивных оболочках, можно обсудить (, хотя я не совсем уверен, что дебаты здесь будут иметь большое значение для bashразработчиков ). Кажется, вы думаете, что у большинства пользователей bashпроблемы с расширениями истории, но ни один из вас и я не знаем, насколько распространено их использование.

Оболочки Unix позволяют изменять поведение оболочки в соответствии со своими личными потребностями и вкусами. Если вы хотите отключить замену истории для всех ваших интерактивных оболочек,продолжайте делать то, что вы делаете, используя set +Hв вашем файле ~/.bashrc, или лоббируйте разработчиков bashдля изменения значения по умолчанию (, что, я полагаю, расстроит и запутает больше людей, чем поможет ).

32
27.01.2020, 19:46

Подстановка истории полезна. Возьмем, к примеру,

% make-me-a-sandwich
make-me-a-sandwich: Permission denied
% sudo !!
Ok.
9
27.01.2020, 19:46

Why is bash history substitution still enabled by default?

Потому что им пользуются многие люди, а людям, использующим интерактивную оболочку bash, возможно, следует знать правила, чтобы избежать проблем, и обычно они больше помогают, чем вредят.

My.bashrc has included set +H for many many years but some other people are still getting bitten by this feature.

Таким образом, вы не используете эту функцию, но это не значит, что ее не использует большинство пользователей. Вы можете подать прошение об изменении значения по умолчанию, но вы должны посмотреть на A )долю людей, которые заботятся , и B )на долю людей, которые предпочитают, чтобы это было по-вашему.Люди, которым это небезразлично и не нравится , возможно, уже отключили его. Его изменение поможет, когда они получат учетную запись на новом компьютере. Люди, которым небезразлично и нравится , должны будут обновить свои настройки на каждом компьютере, который они используют, и на каждой учетной записи, которую они получат в будущем.

Given that pretty much everybody are using terminals with copy-paste features

На мой взгляд, более громоздкий вариант...

is there really any reason to have the feature at all? None of the existing scripts would be broken even if this was disabled by default for all shells.

Да, люди находят это полезным. Какой смысл иметь пульт дистанционного управления, если раньше можно было просто встать и переключить канал?

(Clearly the feature has major issues if it's disabled by default for all scripting and a feature exists to verify the results before executing: shopt -s histverify.)

История не имеет смысла в сценариях, но, что более важно, она может вызвать проблемы с безопасностью. В вашем случае вы можете избежать проблемы, используя одинарные кавычки. Я не помню, чтобы это когда-либо вызывало у меня проблемы, поэтому я не знаю, как вы можете говорить, что у него есть «серьезные проблемы». Вызвало ли это для вас настоящую проблему или вас раздражала необходимость устанавливать значения по умолчанию на новом компьютере?

Я не вижу, чем это отличается от необходимости экранировать или использовать одинарные кавычки, если вы действительно хотите получить немного денег:

$ echo "Give me $50 or the cat gets it"
Give me $0 or the cat gets it
2
27.01.2020, 19:46

Теги

Похожие вопросы