Чому заміна історії bash все ще включена за замовчуванням? [зачинено]


17

Хтось знає, чому у Bash все ще включена заміна за замовчуванням? Моя .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
@Barmar: Звичайно. Але моя суть полягала в тому, щоб оскаржити припущення, що на цьому питанні спирається питання.
Мартін Боннер підтримує Моніку

5
Якщо ми дотримуємося ваших міркувань, все, що вимагає втечі чи цитування, повинно бути вимкнено за замовчуванням. Чому мені потрібно уникати або цитувати URL-адресу, що містить &? Чому мені потрібно уникати або цитувати ім'я файлу, що містить a ?? Є інтерфейси для людей, які вважають, що це проблема.
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 також додатково спрацьовують як оболонка (змінна інтерполяція). Як і будь-яка мова програмування, це допомагає, якщо ви зможете запам’ятати, на якій мові зараз працює.
Kusalananda

5
" моя думка полягає в тому, що так рідко використовується спеціальний персонаж " Я б сказав, що це навпаки ... !такий рідко використовується як нормальний персонаж, що - повторювані WTFs вбік - кількість людей, які потрапляють в полон, значно переважає за кількістю людей, які все ще використовують його для підстановки історії.
TripeHound

3
-1 для відведення вини на неправильне цитування. Оскільки не! є особливим для більшості оболонок Борна, а також у сценаріях, існує багато шляхів, за якими люди можуть розумно дізнатися, що розширить, але не те . Я познайомився з бурундовою оболонкою , і моя перша зустріч із заміною історії була, коли мене покусали, коли я намагався зробити якийсь швидкий однокласник в інтерактивній оболонці. Люди, які володіють переносними та сценаріальними використанням оболонок Борна, часто їх кусають хоча б раз при використанні . bash"$my_var some text!!"$my_var!!busybox ashbashbash
mtraceur

9

Заміна історії корисна. Візьмемо для прикладу

% make-me-a-sandwich
make-me-a-sandwich: Permission denied
% sudo !!
Ok.

2
Так? Якщо вам це здається корисним, ви можете ввімкнути його у своєму .bashrc.
Бармар


3
@Barmar, і якщо вам це стане непотрібним, ви можете вимкнути його. Смішно, як працює симетрія.
варення

3
@hobbs Якщо ви не знаєте, що вона існує, як би ви могли її відключити?
Бармар

2
Ця відповідь добре допомагає пояснити одну причину, чому ця функція корисна. Я думаю, що ОП хоче зрозуміти, чому ця корисність є достатньою для обгрунтування такої поведінки, навіть якщо ОП (та інші, такі як люди, які задають кілька пов'язаних питань на цій стадії обміну) вважають цю поведінку дивною / несподіваною.
mtraceur

4

Соціальна / культурна інертність.

Це питання знаходиться в проблемному просторі "як люди працюють", тому я збираюся відповісти під цим кутом зору, не викладаючи жодної думки щодо того, чи має бути функція за замовчуванням.

Для початку, щоб переконатися , що ви розумієте , з іншого боку, вважають , що роздратування ви відчуваєте про те , щоб вийти зі свого шляху , щоб відключити цю функцію, є роздратування вони будуть відчувати , якщо вони повинні були вийти з їх шляху , щоб включити особливість.

Поєднайте вищезгадане з тим, що достатньо bashкористувачів користується цією функцією, пропозиції щодо її видалення або вимкнення за замовчуванням зустрічають опір людей, яким це вже комфортно, якщо вони там за замовчуванням.

Також, bashце оболонка за замовчуванням для багатьох людей (не тільки в сенсі входу або системної оболонки, але в психологічному сенсі). Якщо ваш посилальний кадр для цитування оболонок bash, якщо це оболонка, яку ви дізналися спочатку, то факт, що !є спеціальним символом оболонки, буде відчувати вас природним і автоматичним (або принаймні, коли ви вперше дізнаєтесь про це, це буде просто частиною як оболонка - лише одна химерність, яку можна прийняти серед багатьох).

І якщо ви задумаєтесь, багато bashкористувачів, ймовірно, стикаються з синтаксисом заміни історії в позитивному контексті: вони читають про це або хтось показує їм, і вони бачать можливу корисність цього, коли вони вперше навчаються bash.

Тільки виходячи з периферійного світу інших оболонок, схожих на Борна, вас покусають, !будучи особливими, і, таким чином, схильні сприймати це негативно: Тому що якщо ви звикли до снарядів, де у вас ніколи не було функції, то ваш перший вплив на нього буде тоді, коли він накрутить вас, коли ви намагаєтесь щось зробити поспіхом.

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


2
Ні, це не тільки при походженні з інших снарядів. Я знаю цю функцію в протягом багатьох років в bashі ще вкушена несподіванкою, так як єдині процитувати не завжди працюю на !з - за розбиту bashреалізацію.
Філіппос

@Philippos Це жахливо (ну, не зовсім жахливо ... але якесь негативне негативне квалія). Дякуємо, що вказали на це. Я спробую переглянути цю відповідь пізніше, щоб переконатися у вашій точці моєї відповіді, як тільки я продумав хороший спосіб інтегрувати її.
mtraceur

2

Чому заміна історії bash все ще включена за замовчуванням?

Оскільки багато людей використовують його, а люди, які використовують інтерактивну оболонку bash, ймовірно, повинні знати правила, щоб уникнути проблем, і, як правило, вони вважають, що це допомагає більше, ніж шкодить.

Мій .bashrc включив набір + 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специфічним. Крім того, оболонки, подібні до Борна, переважно мають симетрію між текстом в сценарії та текстом в інтерактивній оболонці, тому ви можете, як правило, перетворюватися з однієї на іншу і працювати так само - і ця функція створює одне з єдиних винятків.
mtraceur

1
Я не бачу, як це відрізняється від необхідності бігти або використовувати одинарні лапки True for zsh, коли одне цитування !завжди працює, але не для bash, де реалізація дає несподівані результати . Ви кажете, ми повинні знати правила , ну чи знаєте ви це пов'язане правило?
Філіппос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.