Czy ktoś wie, dlaczego bash nadal domyślnie włącza podstawianie historii ? Moje .bashrc
zawiera set +H
od wielu lat, ale niektóre inne osoby wciąż gryzą tę funkcję.
Biorąc pod uwagę, że prawie wszyscy używają terminali z funkcjami kopiuj-wklej i bash skompilowany z readline
biblioteką, a podstawianie historii jest domyślnie włączone tylko w interaktywnych powłokach, czy naprawdę jest jakiś powód, aby mieć tę funkcję w ogóle? Żaden z istniejących skryptów nie zostałby uszkodzony, nawet jeśli byłby domyślnie wyłączony dla wszystkich powłok.
Wypróbuj to, jeśli nie wiesz, dlaczego podstawienie historii jest zerwane:
$ set +H # disable feature history substitution
$ echo "WTF???!?!!?"
WTF???!?!!?
$ set -H # enable feature history substitution
$ echo "WTF???!?!!?"
echo WTF???echo WTF???!?!!?
WTF???echo WTF???!?!!?
(Oczywiście ta funkcja ma poważne problemy, jeśli jest domyślnie wyłączona dla wszystkich skryptów i istnieje funkcja umożliwiająca sprawdzenie wyników przed wykonaniem:. shopt -s histverify
)
Zobacz też:
źródło
ls -l foo/bar/baz/weeble.cpp
zless !$
ni przypomnieć polecenia i edytować.&
? Dlaczego powinienem uciec lub podać nazwę pliku zawierającego?
? Istnieją interfejsy dla osób, które uważają, że to problem.!$
kilka razy dziennie, a także!!
dość często. Muszę przyznać, że nie używam tak często innych podstawień historii, ale na pewno byłbym niezadowolony, gdyby domyślne zachowanie powłoki używanej przez lata nagle uległo zmianie.Odpowiedzi:
Jeśli jesteś już zaznajomiony z tym
bash
, radzenie sobie z wzorcami zastępowania historii nie jest bardziej prawdopodobne, aby cię ugryźć, niż obsługa innych znaków, które są specjalne dla tej powłoki. Jeśli jednak ktoś nie jest zaznajomiony z powłoką lub po prostu nigdy nie użył jej funkcji zastępowania historii, będzie to oczywiście niespodzianka, gdy wyzwoli ją pozornie nieszkodliwy niecytowany lub podwójny ciąg.W interaktywnej powłoce z włączonymi podstawieniami historii
!
znak jest wyjątkowy w prawie taki sam sposób, jak$
znak jest wyjątkowy, tj. Wszędzie, chyba że jest\
poprzedzony ciągiem cudzysłowu lub ciągami cudzysłowu.W przeciwieństwie do
$
przejścia, zastępowanie historii nie rozwija się w dokumentach tutaj, a ponieważ są one zorientowane liniowo, dodatkowo będą miały miejsce w wierszach, w których podstawienie mieści się w kontekście bez cudzysłowu lub w kontekście podwójnego cudzysłowu (w tym wierszu, gdy skanowane osobno) . Zobacz ten raport o błędzie, aby uzyskać więcej informacji .Podstawianie historii jest wyłączone w nieinteraktywnych powłokach (skryptach), ponieważ funkcja historii poleceń powłoki nie jest tam potrzebna, nie dlatego, że funkcja ma „poważne problemy”. W skrypcie zapisywanie każdego polecenia
$HISTFILE
bez sensu, podobnie jak podstawianie historii, nie jest czymś, na czym chciałbyś polegać w skrypcie.To, czy powinno być domyślnie włączone, czy nie w interaktywnych powłokach, można dyskutować (choć nie jestem do końca przekonany, że debata tutaj miałaby duże znaczenie dla
bash
programistów). Wydaje ci się, że większośćbash
użytkowników ma problemy z rozszerzaniem historii, ale żaden z was i ja nie wiemy, jak często z nich korzystać.Powłoki uniksowe pozwalają modyfikować zachowanie powłoki, aby dopasować ją do osobistych potrzeb i gustu. Jeśli chcesz wyłączyć podstawienia historii dla wszystkich interaktywnych powłok, kontynuuj robienie tego, co robisz
set +H
w swoim~/.bashrc
pliku lub lobbujbash
programistom, aby zmienić domyślną (co, moim zdaniem, zdenerwuje i pomyli więcej osób, niż to pomoże ).źródło
bash
użytkowników. Nie sądzę, żeby którekolwiek z nas wiedziało, jak powszechne. Sugeruję, że jeśli czujesz się mocno na ten temat, prześlij żądanie funkcji / błędu nabash
listę mailingową. Zobacz savannah.gnu.org/mail/?group=bash!
jest tak rzadko używana jako normalna postać, że - pomijając echa WTF - liczba ludzi, którzy zostali złapani, jest znacznie większa przez liczbę osób, które nadal używają go do zastąpienia historii.!
jest wyjątkowy dla większości powłok podobnych do Bourne'a, ani w skryptach, istnieje wiele ścieżek, dzięki którym ludzie mogą w rozsądny sposób dowiedzieć się, które rozwiną, ale nie . Zapoznałem się z powłoką podobną do Bourne'a i moje pierwsze spotkanie z podstawieniem historii polegało na tym , że gryzłem ją, kiedy próbowałem zrobić szybką liniówkę w interaktywnej powłoce. Ludzie biegli w przenośnym i skryptowym korzystaniu z powłok podobnych do Bourne'a często gryzą go przynajmniej raz podczas używania .bash
"$my_var some text!!"
$my_var
!!
busybox ash
bash
bash
Zastąpienie historii jest przydatne. Weź na przykład
źródło
.bashrc
.Bezwładność społeczna / kulturowa.
To pytanie znajduje się w przestrzeni problemowej dotyczącej działania ludzi, więc odpowiem pod tym kątem, nie wydając żadnej opinii na temat tego, czy funkcja powinna być domyślnie włączona.
Aby rozpocząć, aby upewnić się zrozumieć drugą stronę, uważają, że kłopot czujesz konieczności przechodzenia na swojej drodze, aby wyłączyć tę funkcję, jest kłopot, że będzie się czuł, gdyby musieli wychodzić na ich drodze, aby włączyć funkcja.
Połącz powyższe z faktem, że wystarczająca liczba
bash
użytkowników korzysta z tej funkcji, sugestie jej usunięcia lub domyślnego wyłączenia spotkały się z oporem ze strony osób, które już czują się komfortowo, gdy jest tam domyślnie.Ponadto
bash
jest domyślną powłoką dla wielu osób (nie tylko w domyślnym sensie logowania lub powłoki systemowej, ale w sensie psychologicznym). Jeśli twoją ramką odniesienia dla cytowania powłoki jestbash
, jeśli jest to powłoka, której nauczyłeś się najpierw, fakt, że!
jest ona specjalną postacią powłoki, będzie dla ciebie naturalny i automatyczny (a przynajmniej, gdy się ją nauczysz, będzie to po prostu część sposób, w jaki jest to skorupa, tylko jedno dziwactwo do zaakceptowania wśród wielu).A jeśli się nad tym zastanowić, wielu
bash
użytkowników prawdopodobnie napotyka składnię podstawiania historii w pozytywnym kontekście: czytają o tym lub ktoś im to pokazuje i widzą możliwą przydatność, gdy zaczynają się uczyćbash
.Pochodzi tylko z peryferyjnego świata innych powłok podobnych do Bourne'a, że zostałbyś ugryziony przez
!
bycie wyjątkowym, a tym samym miałbyś skłonność do postrzegania go negatywnie: Ponieważ jeśli jesteś przyzwyczajony do pocisków, w których nigdy nie miałeś tej cechy, to twój pierwszy narażenie się na to nastąpi, gdy cię spieprzysz, gdy spróbujesz coś zrobić w pośpiechu.TL; DR: Większość użytkowników prawdopodobnie nie dba o to, jaka jest wartość domyślna , niektórzy użytkownicy lubią tę funkcję i mają tę zaletę, że już taka jest, a nie było wystarczającej liczby osób aktywnie opowiadających się przeciwko tej funkcji, aby przezwyciężyć to.
źródło
bash
i wciąż gryzę się z zaskoczenia, ponieważ pojedyncze cytowanie nie zawsze działa z!
powodu zepsutejbash
implementacji.Ponieważ wiele osób go używa, a ludzie używający interaktywnej powłoki bash prawdopodobnie powinni znać zasady, aby uniknąć problemów i na ogół stwierdzą, że pomaga to bardziej niż boli.
Jest to więc funkcja, której nie używasz, co nie znaczy, że większość użytkowników jej nie używa. Możesz złożyć wniosek o zmianę wartości domyślnej, ale musisz spojrzeć na A) część ludzi, którym zależy , i B) proporcję osób, które wolą to na swój sposób. Ludzie, którym zależy i których nie lubią, prawdopodobnie już mają to wyłączone. Zmiana tego pomogłaby, gdy założą konto na nowym komputerze. Osoby, którym to zależy i które to lubią, będą musiały aktualizować swoje ustawienia na każdym komputerze, którego używają i na każdym koncie, które otrzymają w przyszłości.
Moim zdaniem dziwniejsza opcja ...
Tak, ludzie uważają to za przydatne. Jaki jest pożytek z posiadania pilota zdalnego sterowania, z którego mogłeś po prostu wstać i zmienić kanał?
Historia naprawdę nie ma sensu w skryptach, ale co ważniejsze, może powodować problemy z bezpieczeństwem. W twoim przypadku możesz uniknąć problemu, używając pojedynczych cudzysłowów. Nie pamiętam, aby kiedykolwiek powodowało to dla mnie problem, więc nie wiem, jak można powiedzieć, że ma „poważne problemy”. Czy spowodowało to dla ciebie rzeczywisty problem, czy denerwowało Cię ustawienie domyślnych ustawień na nowym komputerze?
Nie rozumiem, jak to się różni od konieczności ucieczki lub użycia pojedynczych cudzysłowów, jeśli naprawdę chcesz dostać trochę pieniędzy:
źródło
shopt -s histverify
ale że nie było domyślnie. Ponadto samodzielne ustalenie przyczyny jest dość trudne, ponieważ komunikat o błędzie jest tajemniczy („nie znaleziono zdarzenia”), a sekwencja znaków, która go wyzwala, jest trudna do wyszukania w Google.$
bycie wyjątkowym w środku,"..."
są jedną z pierwszych rzeczy, których ludzie dowiadują się o powłoce, podczas gdy fakt, że!
jest ona wyjątkowa"..."
(ale tylko w trybie interaktywnym) jest mniej znana, zazwyczaj nie uczy się tak od razu / w widocznym miejscu i jestbash
specyficzny. Ponadto powłoki podobne do Bourne'a w większości mają symetrię między tekstem w skrypcie i tekstem na interaktywnej powłoce, więc możesz ogólnie kopiować z jednego na drugi i mieć to samo - i ta funkcja tworzy jeden z wyjątków.zsh
, gdy pojedyncze cytowanie!
zawsze działa, ale nie w przypadkubash
, gdy implementacja daje nieoczekiwane wyniki . Mówisz, że powinniśmy znać zasady , czy znasz tę powiązaną zasadę?