Кто-нибудь знает, почему в bash по-прежнему включена подмена истории ? My .bashrc
включил в set +H
течение многих лет, но некоторые другие люди все еще получают укус этой функции.
Учитывая, что почти все используют терминалы с функциями копирования и вставки, а bash, скомпилированный с readline
библиотекой, и подстановка истории включена по умолчанию только в интерактивных оболочках, есть ли какая-то причина вообще иметь эту функцию? Ни один из существующих сценариев не будет нарушен, даже если он был отключен по умолчанию для всех оболочек.
Попробуйте это, если вы не знаете, почему подмена истории нарушена:
$ set +H # disable feature history substitution
$ echo "WTF???!?!!?"
WTF???!?!!?
$ set -H # enable feature history substitution
$ echo "WTF???!?!!?"
echo WTF???echo WTF???!?!!?
WTF???echo WTF???!?!!?
(Очевидно, что у функции есть серьезные проблемы, если она отключена по умолчанию для всех сценариев, и существует функция для проверки результатов перед выполнением:. shopt -s histverify
)
Смотрите также:
источник
ls -l foo/bar/baz/weeble.cpp
сless !$
чем вспомнить команды и редактировать его.&
? Почему мне нужно экранировать или указывать имя файла, содержащее?
? Есть интерфейсы для людей, которые думают, что это проблема.!$
несколько раз в день, и!!
довольно часто. Я должен признать, что я не использую другие замены истории, но я определенно был бы недоволен, если бы поведение оболочки по умолчанию, которое я использовал в течение многих лет, внезапно изменилось.Ответы:
Если вы уже знакомы
bash
, то работа с шаблонами подстановки истории не будет намного более вероятной, чем обработка любых других символов, характерных для этой оболочки. Однако, если кто-то незнаком с оболочкой или просто никогда не использовал ее функции подстановки истории, это будет неожиданностью, когда казалось бы безобидные строки без кавычек или двойные кавычки запускают ее.В интерактивной оболочке с включенными подстановками истории
!
символ является особенным почти так же, как и$
символ, то есть везде, если только не экранирован\
или не заключен в одиночные кавычки.В отличие от
$
сквозного, подстановки истории не расширяются в здесь-документах, и, поскольку они ориентированы на строки , они дополнительно будут происходить в строках, где подстановка попадает в контекст без кавычек или контекст с двойными кавычками (в этой строке при сканировании отдельно) , Смотрите этот отчет об ошибке для получения дополнительной информации .Подстановка истории отключена в неинтерактивных оболочках (скриптах), потому что там не нужна возможность истории команд оболочки, а не потому, что эта функция имеет «серьезные проблемы». В сценарии сохранение каждой команды
$HISTFILE
не имеет смысла, и подстановка истории также не является чем-то, на что вы бы хотели положиться в сценарии.Вопрос о том, должен ли он быть включен по умолчанию или нет в интерактивных оболочках, может обсуждаться (хотя я не совсем уверен, что дискуссия здесь будет иметь большое значение для
bash
разработчиков). Вы, кажется, думаете, что у большинстваbash
пользователей есть проблемы с расширениями истории, но ни один из вас и я не знают, как часто их используют.Оболочки Unix позволяют изменять поведение оболочки в соответствии с личными потребностями и вкусом. Если вы хотите отключить подстановки истории для всех ваших интерактивных оболочек, продолжайте делать то, что вы делаете, используя
set +H
в своем~/.bashrc
файле, или лоббируйтеbash
разработчиков, чтобы изменить значение по умолчанию (которое, я считаю, расстроит и запутает больше людей, чем могло бы помочь ).источник
bash
пользователей. Я не думаю, что кто-либо из нас знает, как часто это происходит. Я бы посоветовал вам, если вы сильно настроены по этому поводу, отправлять запрос на функцию / ошибку вbash
список рассылки. См savannah.gnu.org/mail/?group=bash!
он настолько редко используется как обычный персонаж, что - отголоски WTF - количество пойманных людей намного перевешивает по количеству людей, которые все еще используют его, чтобы заменить историю.!
это не является особенным для большинства оболочек, подобных Борну, и дляbash
сценариев, существует множество путей, которыми люди могут разумно учиться,"$my_var some text!!"
которые расширят,$my_var
но не расширят!!
. Я познакомился с Bourne-подобной оболочкойbusybox ash
, и мое первое знакомство сbash
подстановкой истории состояло в том, что я был укушен ею, когда пытался сделать одну быструю однострочную оболочку в интерактивной оболочке. Людей, опытных в использовании портативных и скриптовых оболочек типа Борна, часто укусывают, по крайней мере, один раз при использованииbash
.Подмена истории полезна. Возьмите например
источник
.bashrc
.Социальная / культурная инерция.
Этот вопрос находится в пространстве проблем «как работают люди», поэтому я собираюсь ответить с этой точки зрения, не высказывая никакого мнения о том, должна ли функция включаться по умолчанию.
Для начала, чтобы убедиться , что вы понимаете , с другой стороны, считают , что раздражение вы чувствуете о том , чтобы выйти из своего пути , чтобы отключить эту функцию, является раздражение они будут чувствовать , если они должны были выйти из их пути , чтобы включить особенность
Объедините вышесказанное с тем фактом, что достаточное количество
bash
пользователей используют эту функцию, предложения по ее удалению или отключению по умолчанию встречают сопротивление со стороны людей, которые уже привыкли к ее присутствию по умолчанию.Кроме того,
bash
это оболочка по умолчанию для многих людей (не только в смысле логина по умолчанию или системной оболочки, но и в психологическом смысле). Если ваша система отсчета для цитирования оболочкиbash
, если это оболочка, которую вы изучили в первую очередь, то, что!
это специальный символ оболочки, будет казаться вам естественным и автоматическим (или, по крайней мере, когда вы впервые изучите его, это будет лишь часть способ, которым оболочка, только одна причуда, чтобы принять среди многих).И если вы подумаете об этом, многие
bash
пользователи, вероятно, сталкиваются с синтаксисом подстановки истории в положительном контексте: они читают об этом, или кто-то показывает им это, и они видят возможную полезность этого, когда они впервые изучаютbash
.Это происходит только из периферийного мира других оболочек типа Борна, что вы будете укушены
!
особенным и поэтому будете склонны рассматривать его негативно: потому что, если вы привыкли к оболочкам, в которых у вас никогда не было этой функции, то ваш первый воздействие этого будет происходить, когда он вас винит, когда вы пытаетесь сделать что-то в спешке.TL; DR: Большинству пользователей, вероятно, не очень важно, какой вариант используется по умолчанию , некоторым пользователям нравится эта функция, и у нее уже есть сильное преимущество в том, что она уже есть, и людей, активно выступающих против этой функции, было недостаточно. преодолеть это.
источник
bash
и еще укушена неожиданностью, так как единые процитировать не всегда работаю на!
из - за разбитуюbash
реализацию.Потому что многие люди используют его, и люди, использующие интерактивную оболочку bash, вероятно, должны знать правила, чтобы избежать проблем, и, как правило, считают, что это помогает больше, чем вредно.
Так что это функция, которую вы не используете, это не значит, что большинство пользователей не используют ее. Вы можете ходатайствовать об изменении значения по умолчанию, но вы должны посмотреть на A) долю людей, которые заботятся , и B) соотношение людей, которые предпочитают это по-вашему. Люди, которые заботятся и не любят это, вероятно, уже отключили это. Изменение этого поможет, когда они получат учетную запись на новом компьютере. Людям, которые заботятся и любят это , придется обновлять свои настройки на каждом компьютере, который они используют, и на каждой учетной записи, которую они получат в будущем.
Более грубый вариант на мой взгляд ...
Да, люди находят это полезным. Какая польза от пульта дистанционного управления, если вы привыкли просто вставать и менять канал?
История не имеет смысла в сценариях, но, что более важно, она может вызвать проблемы с безопасностью. В вашем случае вы можете избежать проблемы, используя одинарные кавычки. Я не помню, чтобы это когда-либо вызывало у меня проблемы, поэтому я не знаю, как вы можете сказать, что у него есть «серьезные проблемы». Вызывает ли это реальную проблему для вас, или вас раздражает необходимость установить настройки по умолчанию на новом компьютере?
Я не понимаю, чем это отличается от необходимости избегать или использовать одинарные кавычки, если вы действительно хотите получить немного денег:
источник
shopt -s histverify
но это не было включено по умолчанию. Кроме того, выяснить причину самостоятельно довольно сложно, потому что сообщение об ошибке является загадочным («событие не найдено») и последовательность символов, которая вызывает его, трудно найти в Google.$
как особенность внутри,"..."
являются одной из первых вещей, которые люди узнают о оболочке, в то время!
как особенность внутри"..."
(но только в интерактивном режиме) менее широко известна, как правило, не преподается как сразу / заметно, а являетсяbash
-специфичным. Кроме того, оболочки типа Bourne в основном имеют симметрию между текстовым шрифтом и текстовым на интерактивной оболочке, поэтому вы можете в общем случае копировать один в другой и работать одинаково - и эта функция создает одно из единственных исключений.zsh
, когда одинарные кавычки!
всегда работают, но не дляbash
тех случаев, когда реализация дает неожиданные результаты . Вы говорите, мы должны знать правила , хорошо, вы знали это связанное правило?