Почему замена истории bash все еще включена по умолчанию? [закрыто]

17

Кто-нибудь знает, почему в 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)

Смотрите также:

Микко Ранталайнен
источник
16
Вы, кажется, думаете, что люди не используют подмену истории. Я использую это каждый день. Я считаю , чтобы быстрее следовать ls -l foo/bar/baz/weeble.cppс less !$чем вспомнить команды и редактировать его.
Мартин Боннер поддерживает Монику
2
@MartinBonner Так что вы можете включить его. Вопрос в том, почему он включен по умолчанию , а не почему он все еще существует.
Бармар
5
@ Бармар: Конечно. Но я хотел опровергнуть предположение, что вопрос основан на.
Мартин Боннер поддерживает Монику
5
Если мы следуем вашим рассуждениям, все, что требует экранирования или цитирования, должно быть отключено по умолчанию. Зачем мне нужно экранировать или цитировать URL, содержащий &? Почему мне нужно экранировать или указывать имя файла, содержащее ?? Есть интерфейсы для людей, которые думают, что это проблема.
jcaron
3
Я использую !$несколько раз в день, и !!довольно часто. Я должен признать, что я не использую другие замены истории, но я определенно был бы недоволен, если бы поведение оболочки по умолчанию, которое я использовал в течение многих лет, внезапно изменилось.
jcaron

Ответы:

32

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

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

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

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

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

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

Кусалананда
источник
2
@MikkoRantalainen Вы, кажется, думаете, что подмена истории - это не то, чем пользуется большинство bashпользователей. Я не думаю, что кто-либо из нас знает, как часто это происходит. Я бы посоветовал вам, если вы сильно настроены по этому поводу, отправлять запрос на функцию / ошибку в bashсписок рассылки. См savannah.gnu.org/mail/?group=bash
Kusalananda
8
Правильно. Проблема на самом деле не в подстановке истории, а в том, что двойные «кавычки» в Bash на самом деле не являются кавычками в том смысле, что другие языки используют этот термин, а скорее работают как особый вид скобок. @MikkoRantalainen, сделайте привычкой помещать все, что вы не хотите, чтобы Bash интерпретировал каким-либо особым образом в одинарных кавычках!
оставил около
5
@leftaroundabout Это зависит от того, что вы подразумеваете под переводом. Большинство языков интерпретируют управляющие символы в строках для вывода (но они предоставляются не так, как в оболочке, когда просто перетасовывают строки). Правила цитирования в Perl дополнительно работают почти так же, как правила оболочки (переменная интерполяция). Как и с любым языком программирования,
полезно
5
« Моя точка зрения такова, что так редко используется специальный символ », я бы сказал, что это наоборот… !он настолько редко используется как обычный персонаж, что - отголоски WTF - количество пойманных людей намного перевешивает по количеству людей, которые все еще используют его, чтобы заменить историю.
TripeHound
3
-1 за отклонение вины от неправильного цитирования. Поскольку !это не является особенным для большинства оболочек, подобных Борну, и для bashсценариев, существует множество путей, которыми люди могут разумно учиться, "$my_var some text!!"которые расширят, $my_varно не расширят !!. Я познакомился с Bourne-подобной оболочкой busybox ash, и мое первое знакомство с bashподстановкой истории состояло в том, что я был укушен ею, когда пытался сделать одну быструю однострочную оболочку в интерактивной оболочке. Людей, опытных в использовании портативных и скриптовых оболочек типа Борна, часто укусывают, по крайней мере, один раз при использовании bash.
mtraceur
9

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

% make-me-a-sandwich
make-me-a-sandwich: Permission denied
% sudo !!
Ok.
Йохан Мирен
источник
2
Так? Если вы найдете это полезным, вы можете включить его в своем .bashrc.
Бармар
3
xkcd.com/149
Уолтер Тросс
3
@ Barmar, и если он окажется бесполезным, вы можете отключить его. Забавно, как работает симметрия.
Хоббс
3
@hobbs Если вы не знаете, что он существует, как вы могли бы отключить его?
Бармар
2
Этот ответ хорошо объясняет одну из причин полезности этой функции. Я думаю, что OP хочет понять, почему эта полезность достаточна для оправдания такого поведения, даже несмотря на то, что OP (и другие, такие как люди, задающие несколько связанных вопросов на этом стеке обмена), находят такое поведение удивительным / неожиданным.
mtraceur
4

Социальная / культурная инерция.

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

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

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

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

И если вы подумаете об этом, многие bashпользователи, вероятно, сталкиваются с синтаксисом подстановки истории в положительном контексте: они читают об этом, или кто-то показывает им это, и они видят возможную полезность этого, когда они впервые изучают bash.

Это происходит только из периферийного мира других оболочек типа Борна, что вы будете укушены !особенным и поэтому будете склонны рассматривать его негативно: потому что, если вы привыкли к оболочкам, в которых у вас никогда не было этой функции, то ваш первый воздействие этого будет происходить, когда он вас винит, когда вы пытаетесь сделать что-то в спешке.

TL; DR: Большинству пользователей, вероятно, не очень важно, какой вариант используется по умолчанию , некоторым пользователям нравится эта функция, и у нее уже есть сильное преимущество в том, что она уже есть, и людей, активно выступающих против этой функции, было недостаточно. преодолеть это.

mtraceur
источник
2
Нет, это не только из других оболочек. Я знаю эту функцию в течение многих лет в bashи еще укушена неожиданностью, так как единые процитировать не всегда работаю на !из - за разбитую bashреализацию.
Филиппос
@Philippos Это ужасно (ну, не совсем ужасно ... но что-то вроде негативных качеств). Спасибо за указание на это. Я постараюсь вернуться к этому ответу позже, чтобы уточнить вашу точку зрения в моем ответе, как только подумаю над хорошим способом его интеграции.
mtraceur
2

Почему замена истории bash все еще включена по умолчанию?

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

Мой .bashrc включал set + H в течение многих лет, но некоторые другие люди все еще укушаются этой функцией.

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

Учитывая, что почти все используют терминалы с функциями копирования и вставки

Более грубый вариант на мой взгляд ...

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

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

(Очевидно, что у этой функции есть серьезные проблемы, если она отключена по умолчанию для всех сценариев, и существует функция для проверки результатов перед выполнением: shopt -s histverify.)

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

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

$ echo "Give me $50 or the cat gets it"
Give me $0 or the cat gets it
Джейсон Гомаат
источник
2
Смотрите связанные вопросы (правая колонка); большинство вопросов затрагивают эту функцию случайно и предполагают, что оболочка сломана. Я лично узнал об этой функции давным-давно из-за того, что я случайно использовал последовательность символов, которая вызвала неправильный вывод. Я был бы спасен, shopt -s histverifyно это не было включено по умолчанию. Кроме того, выяснить причину самостоятельно довольно сложно, потому что сообщение об ошибке является загадочным («событие не найдено») и последовательность символов, которая вызывает его, трудно найти в Google.
Микко Ранталайнен
1
Людей искренне укушает эта функция, потому что «универсальные» функции синтаксиса оболочки, такие $как особенность внутри, "..."являются одной из первых вещей, которые люди узнают о оболочке, в то время !как особенность внутри "..."(но только в интерактивном режиме) менее широко известна, как правило, не преподается как сразу / заметно, а является bash-специфичным. Кроме того, оболочки типа Bourne в основном имеют симметрию между текстовым шрифтом и текстовым на интерактивной оболочке, поэтому вы можете в общем случае копировать один в другой и работать одинаково - и эта функция создает одно из единственных исключений.
mtraceur
1
Я не понимаю, чем это отличается от необходимости избегать или использовать одинарные кавычки True для zsh, когда одинарные кавычки! всегда работают, но не для bashтех случаев, когда реализация дает неожиданные результаты . Вы говорите, мы должны знать правила , хорошо, вы знали это связанное правило?
Филиппос