Perché la sostituzione della cronologia di bash è ancora abilitata per impostazione predefinita? [chiuso]


17

Qualcuno sa perché Bash ha ancora la sostituzione della cronologia abilitata per impostazione predefinita? La mia .bashrcè stata inclusa set +Hper molti anni, ma alcune altre persone vengono ancora morse da questa funzione.

Dato che praticamente tutti usano terminali con funzionalità copia-incolla e bash compilato con la sostituzione della readlinelibreria e della cronologia è abilitato di default solo nelle shell interattive, c'è davvero qualche motivo per avere la funzione? Nessuno degli script esistenti sarebbe rotto anche se questo fosse disabilitato di default per tutte le shell.

Prova questo se non sai perché la sostituzione della cronologia è interrotta:

$ set +H # disable feature history substitution
$ echo "WTF???!?!!?"
WTF???!?!!?
$ set -H # enable feature history substitution
$ echo "WTF???!?!!?"
echo WTF???echo WTF???!?!!?
WTF???echo WTF???!?!!?

(Chiaramente la funzione ha grossi problemi se è disabilitata per impostazione predefinita per tutti gli script ed esiste una funzione per verificare i risultati prima di eseguire:. shopt -s histverify)

Guarda anche:


16
Sembra che la gente non usi la sostituzione della storia. Lo uso ogni giorno. Trovo a più veloce da seguire ls -l foo/bar/baz/weeble.cppcon less !$rispetto richiamo del comando e modificarlo.
Martin Bonner supporta Monica il

2
@MartinBonner Quindi puoi abilitarlo. La domanda è perché è abilitato per impostazione predefinita , non perché esiste ancora.
Barmar,

5
@Barmar: Sicuro. Ma il mio punto era sfidare il presupposto su cui si basa la domanda.
Martin Bonner supporta Monica il

5
Se seguiamo il tuo ragionamento, tutto ciò che richiede la fuga o il preventivo dovrebbe essere disabilitato per impostazione predefinita. Perché dovrei dover scappare o citare un URL contenente &? Perché dovrei dover scappare o citare un nome file che contiene un ?? Ci sono interfacce utente per le persone che pensano che questo sia un problema.
Jcaron,

3
Uso !$più volte al giorno e anche !!abbastanza spesso. Devo ammettere che non uso così tanto altre sostituzioni di cronologia, ma sarei sicuramente infelice se il comportamento predefinito della shell che sto usando da anni è improvvisamente cambiato.
jcaron,

Risposte:


32

Se hai già familiarità bash, allora avere a che fare con i modelli di sostituzione della storia non è molto più probabile che ti morda rispetto alla gestione di qualsiasi altro personaggio speciale di questa shell. Tuttavia, se uno non ha familiarità con la shell o semplicemente non ha mai usato le sue caratteristiche di sostituzione della storia, sarà ovviamente una sorpresa quando le stringhe apparentemente innocue non citate o con virgolette doppie la attivano.

In una shell interattiva con sostituzioni di cronologia abilitate, il !personaggio è speciale praticamente nello stesso modo in cui $è speciale, cioè ovunque a meno che non sia evaso con \o in stringhe a virgoletta singola.

Al contrario di $attraverso, sostituzioni storia non si espandono in qua-documenti, e poiché sono orientato alla linea, essi inoltre si verificano su linee in cui la sostituzione rientra in un contesto non menzionata o un contesto doppia indicata (in tale linea quando digitalizzato separatamente) . Vedi questo bug report per maggiori informazioni .

La sostituzione della cronologia è disabilitata nelle shell non interattive (script) perché la capacità della cronologia dei comandi della shell non è necessaria lì, non perché la funzione presenta "problemi principali". In uno script, salvare tutti i comandi in modo $HISTFILEinsensato e allo stesso modo la sostituzione della cronologia non è qualcosa su cui vorresti fare affidamento in uno script.

Se si debba abilitare o meno l'impostazione predefinita o meno nelle shell interattive può essere discusso (anche se non sono del tutto convinto che un dibattito qui avrebbe molta importanza per gli bashsviluppatori). Sembra che la maggior parte degli bashutenti stia riscontrando problemi con le espansioni della cronologia, ma nessuno di noi e io sappiamo quanto sia comune usarli.

Le shell Unix consentono di modificare il comportamento della shell in base alle proprie esigenze e ai propri gusti. Se si desidera disattivare le sostituzioni della cronologia per tutte le shell interattive, continuare a fare ciò che si sta facendo utilizzando set +Hnel proprio ~/.bashrcfile o fare pressioni sugli bashsviluppatori per modificare l'impostazione predefinita (che, credo, sconvolgerebbe e confonderebbe più persone di quanto sarebbe utile ).


2
@MikkoRantalainen Sembra che la sostituzione della cronologia non sia qualcosa che la maggior parte degli bashutenti sta utilizzando. Non credo che nessuno di noi sappia quanto sia comune. Suggerirei che se ti senti fortemente a riguardo, inoltri una richiesta di funzionalità / bug alla bashmailing list. Vedi savannah.gnu.org/mail/?group=bash
Kusalananda

8
Giusto. Il problema non riguarda affatto la sostituzione della storia, ma il fatto che le doppie "virgolette" in Bash non sono in realtà citazioni nel senso in cui altre lingue usano il termine, ma piuttosto funzionano come un tipo speciale di parentesi. @MikkoRantalainen, prendi l'abitudine di mettere tutto ciò che non vuoi che Bash interpreti in modo speciale tra virgolette singole !
leftaroundabout

5
@leftaroundabout Dipende da cosa intendi per interpretazione. La maggior parte delle lingue interpreta i caratteri di controllo nelle stringhe per l'output (ma concesso, non allo stesso modo della shell quando si mescolano le stringhe). Le regole di quotazione di Perl funzionano anche in modo simile alla shell (interpolazione variabile). Come con qualsiasi linguaggio di programmazione, aiuta se si è in grado di ricordare in quale lingua si sta attualmente lavorando.
Kusalananda

5
"Il mio punto è che! è un personaggio speciale così raramente usato " Direi che è il contrario ... !è così raramente usato come personaggio normale che - facendo eco ai WTF a parte - il numero di persone che vengono catturate è di gran lunga superiore dal numero di persone che lo usano ancora per sostituire la storia.
TripeHound

3
-1 per deviare la colpa su una quotazione impropria. Dal momento che non! è speciale per la maggior parte delle shell tipo Bourne, né negli script, ci sono molti percorsi attraverso i quali le persone possono ragionevolmente imparare che espanderà il ma non il . Ho avuto familiarità con Bourne-come shell , e il mio primo incontro con la sostituzione della storia è stato me di essere morso da quando stavo cercando di fare un po 'rapido uno-liner in una shell interattiva. Le persone abili nell'uso portatile e di scripting di shell tipo Bourne sono spesso morse da esso almeno una volta durante l'uso . bash"$my_var some text!!"$my_var!!busybox ashbashbash
mtraceur,

9

La sostituzione della cronologia è utile. Prendi ad esempio

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

2
Così? Se lo trovi utile, puoi abilitarlo nel tuo .bashrc.
Barmar,


3
@Barmar e se lo trovi non utile puoi disabilitarlo. Divertente come funziona la simmetria.
Hobbs

3
@hobbs Se non sai che esiste, come faresti a disabilitarlo?
Barmar,

2
Questa risposta fa un buon lavoro nel spiegare una delle ragioni per cui la funzione è utile. Penso che OP voglia capire perché questa utilità sia sufficiente per giustificare questo comportamento, anche se OP (e altri, come le persone che fanno molte delle domande correlate su questo scambio di stack) trovano questo comportamento sorprendente / inatteso.
mtraceur,

4

Inerzia sociale / culturale.

Questa domanda è nello spazio problema how-umani-lavoro, quindi ho intenzione di rispondere da questo punto di vista, senza mettere avanti alcun parere sull'opportunità o meno la funzione deve essere attiva per impostazione predefinita.

Per iniziare, per essere sicuro di comprendere l'altro lato, considera che il fastidio che senti di dover fare di tutto per disattivare la funzione, è il fastidio che proverebbero se dovessero fare di tutto per accendere la caratteristica.

Combina quanto sopra con il fatto che un numero sufficiente di bashutenti utilizza la funzione, i suggerimenti per rimuoverla o disattivarla per impostazione predefinita sono incontrati con la resistenza delle persone che sono già a proprio agio con la sua presenza di default.

Inoltre, bashè la shell predefinita per molte persone (non solo nel login predefinito o nel senso della shell di sistema, ma in senso psicologico). Se il tuo frame di riferimento per la quotazione delle shell è bash, se questa è la shell che hai imparato per prima, il fatto che !sia uno speciale personaggio shell sembrerà naturale e automatico per te (o almeno, quando lo imparerai per la prima volta, sarà solo una parte di il modo in cui è la shell, solo una stranezza da accettare tra i tanti).

E se ci pensate, molti bashutenti probabilmente incontrano la sintassi di sostituzione della storia in un contesto positivo : ne leggono o qualcuno glielo mostra e ne vedono la possibile utilità, quando apprendono per la prima volta bash.

Viene solo dal mondo periferico di altre conchiglie simili a Bourne, che saresti morso !essendo speciale e quindi propenso a vederlo negativamente: Perché se sei abituato a conchiglie dove non hai mai avuto la caratteristica, allora il tuo primo l'esposizione sarà quando ti frega quando stai cercando di fare qualcosa in fretta.

TL; DR: la maggior parte degli utenti probabilmente non si preoccupa fortemente di quale sia l' impostazione predefinita in entrambi i casi, ad alcuni utenti piace la funzione e hanno il forte vantaggio che è già così, e non ci sono state abbastanza persone che si impegnano attivamente contro la funzione per superare quello.


2
No, non è solo quando proviene da altre conchiglie. Conosco questa funzione da anni bashe sono ancora morso di sorpresa, poiché la singola citazione non funziona sempre a !causa della mancatabash implementazione.
Philippos,

@Philippos È terrificante (beh, non esattamente terrificante ... ma una sorta di qualia negativa angosciante). Grazie per averlo segnalato. Cercherò di rivisitare questa risposta in seguito per elaborare il tuo punto nella mia risposta una volta che avrò pensato a un buon modo per integrarla.
mtraceur,

2

Perché la sostituzione della cronologia di bash è ancora abilitata per impostazione predefinita?

Perché molte persone lo usano e le persone che usano una shell bash interattiva probabilmente dovrebbero conoscere le regole per evitare problemi e generalmente troveranno che aiuta più di quanto faccia male.

Il mio .bashrc ha incluso set + H per molti anni ma alcune altre persone vengono ancora morse da questa funzione.

Quindi è una funzione che non usi, ciò non significa che la maggior parte degli utenti non la usi. Puoi presentare una richiesta di modifica del valore predefinito, ma devi guardare A) la porzione di persone a cui tieni e B) il rapporto di persone che preferiscono a modo tuo. Le persone a cui importa e che non piacciono probabilmente lo hanno già disabilitato. Modificarlo sarebbe utile quando ottengono un account su un nuovo computer. Le persone che si preoccupano e fanno piacere dovrebbero aggiornare le loro impostazioni su ogni computer che usano e su ogni account che avranno in futuro.

Dato che praticamente tutti usano terminali con funzionalità copia-incolla

Un'opzione più clunkier secondo me ...

c'è davvero qualche motivo per avere la funzione a tutti? Nessuno degli script esistenti verrebbe interrotto anche se questo fosse disabilitato per impostazione predefinita per tutte le shell.

Sì, la gente lo trova utile. A che serve avere un telecomando dato che eri in grado di alzarti e cambiare canale?

(Chiaramente la funzione ha grossi problemi se è disabilitata per impostazione predefinita per tutti gli script ed esiste una funzione per verificare i risultati prima dell'esecuzione: shopt -s histverify.)

La storia non ha davvero senso negli script, ma soprattutto può causare problemi di sicurezza. Nel tuo caso potresti evitare il problema usando virgolette singole. Non ricordo che ciò abbia mai causato un problema per me, quindi non so come si possa dire che abbia "problemi importanti". Questo ha causato un problema reale per te o eri infastidito dal dover impostare le impostazioni predefinite su un nuovo computer?

Non vedo come sia diverso dal dover scappare o usare le virgolette singole in questo se davvero vuoi ottenere dei soldi:

$ echo "Give me $50 or the cat gets it"
Give me $0 or the cat gets it

2
Vedi le domande correlate (colonna di destra); la maggior parte delle domande colpisce questa funzionalità per errore e presume che il guscio sia rotto. Ho imparato personalmente questa funzionalità molto tempo fa a causa del fatto che ho usato accidentalmente una sequenza di caratteri che ha causato un output errato. Sarei stato salvato da shopt -s histverify, ma che non era attiva per impostazione predefinita. Inoltre, capire la causa da soli è piuttosto difficile perché il messaggio di errore è criptico ("evento non trovato") e la sequenza di caratteri che lo attiva è difficile per Google.
Mikko Rantalainen,

1
Le persone vengono veramente morse da questa funzionalità perché le funzioni di sintassi della shell "universali" come l' $essere speciali all'interno "..."sono una delle prime cose che le persone imparano sulla shell, mentre il fatto che !è speciale all'interno "..."(ma solo in modalità interattiva) è meno conosciuto, in genere non insegnato come immediatamente / prominente, ed è bashspecifico. Inoltre, le shell tipo Bourne hanno per lo più una simmetria tra text-in-uno-script e text-on-the-interactive-shell, quindi puoi generalmente copastare l'uno dall'altro e farlo funzionare allo stesso modo - e questa funzione crea una delle uniche eccezioni.
mtraceur,

1
Non vedo come sia diverso dal dover scappare o usare le virgolette singole True per zsh, quando le virgolette singole !funzionano sempre, ma non per bash, in cui l'implementazione produce risultati imprevisti . Dici che dovremmo conoscere le regole , beh, conoscevi quella regola collegata?
Philippos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.