Warum ist die Ersetzung des Bash-Verlaufs weiterhin standardmäßig aktiviert? [geschlossen]

17

Weiß jemand, warum in der Bash immer noch die Ersetzung des Verlaufs standardmäßig aktiviert ist? Meine .bashrchat set +Hfür viele, viele Jahre aufgenommen, aber einige andere Leute werden immer noch von dieser Funktion gebissen.

Angesichts der Tatsache, dass so gut wie alle Benutzer Terminals mit Copy-Paste-Funktionen und Bash -Funktionen verwenden, die mit readlineBibliotheks- und Verlaufssubstitution kompiliert wurden, ist diese Funktion standardmäßig nur in interaktiven Shells aktiviert. Gibt es dann überhaupt einen Grund, diese Funktion zu nutzen? Keines der vorhandenen Skripte würde beschädigt, selbst wenn dies standardmäßig für alle Shells deaktiviert wäre.

Versuchen Sie dies, wenn Sie nicht wissen, warum die Ersetzung der Historie nicht funktioniert:

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

(Offensichtlich hat die Funktion schwerwiegende Probleme, wenn sie standardmäßig für alle Skripte deaktiviert ist und eine Funktion zur Überprüfung der Ergebnisse vor der Ausführung vorhanden ist:. shopt -s histverify)

Siehe auch:

Mikko Rantalainen
quelle
16
Sie scheinen zu glauben, dass die Leute keine Ersetzung der Geschichte verwenden. Ich benutze es jeden Tag. Ich finde zu schneller folgen ls -l foo/bar/baz/weeble.cppmit less !$als Rückruf der Befehl und bearbeiten es.
Martin Bonner unterstützt Monica am
2
@MartinBonner So können Sie es aktivieren. Die Frage ist, warum es standardmäßig aktiviert ist und nicht, warum es noch vorhanden ist.
Barmar
5
@Barmar: Sicher. Es ging mir jedoch darum, die Annahme in Frage zu stellen, dass die Frage prädiziert ist.
Martin Bonner unterstützt Monica am
5
Wenn wir Ihren Überlegungen folgen, sollten alle Elemente, die ein Entweichen oder Zitieren erfordern, standardmäßig deaktiviert werden. Warum muss ich eine URL mit einem Escape-Zeichen oder einem Zitat angeben &? Warum muss ich einen Dateinamen mit einem Escape-Zeichen oder einem Anführungszeichen setzen ?? Es gibt Benutzeroberflächen für Personen, die dies für ein Problem halten.
Jcaron
3
Ich benutze es !$mehrmals am Tag und !!ziemlich oft auch. Ich muss zugeben, dass ich nicht so oft andere History-Substitutionen verwende, aber ich wäre definitiv unglücklich, wenn sich das Standardverhalten der Shell, die ich seit Jahren verwende, plötzlich ändern würde.
Jcaron

Antworten:

32

Wenn Sie bereits mit den bashErsetzungsmustern in der Historie vertraut sind , ist es nicht viel wahrscheinlicher, dass Sie mit Ersetzungsmustern in der Historie zu tun haben, als mit anderen Zeichen, die für diese Shell besonders sind. Wenn man jedoch mit der Shell nicht vertraut ist oder ihre historischen Substitutionsfunktionen nie verwendet hat, wird es offensichtlich eine Überraschung sein, wenn scheinbar harmlose, nicht zitierte oder doppelte Anführungszeichen sie auslösen.

In einer interaktiven Shell mit aktivierten Verlaufssubstitutionen ist das !Zeichen fast genauso speziell wie das $Zeichen, dh überall, es sei denn, es wird mit \oder in Strings in Anführungszeichen geschrieben.

Im Gegensatz zu $through werden Verlaufsersetzungen in Here-Documents nicht erweitert. Da sie zeilenorientiert sind, werden sie zusätzlich in Zeilen eingefügt, in denen die Ersetzung in einen nicht zitierten Kontext oder einen Kontext mit doppelten Anführungszeichen fällt (in dieser Zeile, wenn sie separat gescannt werden). . In diesem Fehlerbericht finden Sie weitere Informationen .

Die Ersetzung des Verlaufs ist in nicht interaktiven Shells (Skripten) deaktiviert, da die Befehlsverlaufsfunktion der Shell dort nicht benötigt wird und die Funktion keine "Hauptprobleme" aufweist. In einem Skript $HISTFILEmacht es keinen Sinn, jeden Befehl zu speichern , und die Ersetzung des Verlaufs ist ebenfalls nichts, worauf Sie sich in einem Skript verlassen möchten.

Ob es in interaktiven Shells standardmäßig aktiviert sein soll oder nicht, kann diskutiert werden (obwohl ich nicht ganz davon überzeugt bin, dass eine Debatte hier für die bashEntwickler von großer Bedeutung wäre ). Sie scheinen zu glauben, dass die meisten bashBenutzer Probleme mit Verlaufserweiterungen haben, aber keiner von Ihnen und ich weiß, wie häufig sie verwendet werden.

Mit Unix-Shells können Sie das Verhalten der Shell an Ihre persönlichen Bedürfnisse und Ihren Geschmack anpassen. Wenn Sie die Verlaufsersetzung für alle Ihre interaktiven Shells deaktivieren möchten, setzen Sie set +HIhre Arbeit mit Ihrer ~/.bashrcDatei fort, oder fordern Sie die bashEntwickler auf, die Standardeinstellung zu ändern (was meines Erachtens mehr Leute verärgern und verwirren würde, als helfen würde) ).

Kusalananda
quelle
2
@MikkoRantalainen Sie scheinen zu glauben, dass die Historiensubstitution nicht von der Mehrheit der bashBenutzer verwendet wird. Ich glaube keiner von uns weiß, wie häufig es ist. Ich würde vorschlagen, dass Sie, wenn Sie dies ernst nehmen, eine Feature- / Fehleranfrage an die bashMailingliste senden . Siehe savannah.gnu.org/mail/?group=bash
Kusalananda
8
Richtig. Das Problem ist eigentlich gar nicht die Ersetzung der Geschichte, sondern die Tatsache, dass doppelte Anführungszeichen in Bash keine wirklichen Anführungszeichen in dem Sinne sind, dass andere Sprachen den Begriff verwenden, sondern wie eine besondere Art von Klammern funktionieren. @MikkoRantalainen, mach es dir zur Gewohnheit, alles, was Bash nicht unbedingt interpretieren soll, in einfache Anführungszeichen zu setzen!
Leftaroundabout
5
@leftaroundabout Es kommt darauf an, was Sie unter Dolmetschen verstehen. Die meisten Sprachen interpretieren Steuerzeichen in Zeichenfolgen für die Ausgabe (jedoch nicht auf die gleiche Weise wie in der Shell, wenn nur Zeichenfolgen gemischt werden). Perls Anführungsregeln funktionieren außerdem ziemlich ähnlich wie die der Shell (variable Interpolation). Wie bei jeder Programmiersprache hilft es, sich zu erinnern, in welcher Sprache man gerade arbeitet.
Kusalananda
5
Mein Punkt ist , dass ist so selten verwendet! Besonderen Charakter “ Ich würde sagen , es ist anders herum ... das !ist so selten als verwendet normaler Charakter , dass - Echo WTFs beiseite - die Zahl der Menschen wird immer ertappte weit überwiegt von der Anzahl der Menschen, die es noch verwenden, um die Geschichte zu ersetzen.
TripeHound
3
-1 für die Ablenkung der Schuld auf falsches Zitieren. Da !es für die meisten Bourne-ähnlichen Shells und auch für Skripte keine Besonderheiten gibt, gibt es viele Wege, auf denen die Leute vernünftigerweise lernen können, dass das erweitert wird, aber nicht das . Ich habe mich mit der Bourne-ähnlichen Shell vertraut gemacht , und meine erste Begegnung mit der Substitution in der Geschichte war, dass ich davon gebissen wurde, als ich versuchte, einen schnellen Einzeiler in einer interaktiven Shell zu erstellen. Menschen, die sich mit der Verwendung von Bourne-ähnlichen Shells in portablen und Skripting-Anwendungen auskennen, werden bei der Verwendung häufig mindestens einmal davon gebissen . bash"$my_var some text!!"$my_var!!busybox ashbashbash
mtraceur
9

Die Ersetzung des Verlaufs ist nützlich. Nimm zum Beispiel

% make-me-a-sandwich
make-me-a-sandwich: Permission denied
% sudo !!
Ok.
Johan Myréen
quelle
2
So? Wenn Sie es nützlich finden, können Sie es in Ihrem aktivieren .bashrc.
Barmar
3
xkcd.com/149
Walter Tross
3
@Barmar und wenn Sie es nicht nützlich finden, können Sie es deaktivieren. Komisch, wie Symmetrie funktioniert.
Hobbs
3
@hobbs Wenn Sie nicht wissen, dass es existiert, woher möchten Sie es deaktivieren?
Barmar
2
Diese Antwort erklärt einen Grund, warum die Funktion nützlich ist. Ich denke, OP möchte verstehen, warum diese Nützlichkeit ausreicht , um dieses Verhalten zu rechtfertigen, obwohl OP (und andere, wie die Leute, die mehrere der verwandten Fragen zu diesem Stapelaustausch stellen) dieses Verhalten überraschend / unerwartet finden.
mtraceur
4

Soziale / kulturelle Trägheit.

Diese Frage befasst sich mit dem Problembereich, wie Menschen arbeiten, und ich werde sie aus diesem Blickwinkel beantworten, ohne eine Meinung darüber abzugeben , ob die Funktion standardmäßig aktiviert sein sollte oder nicht .

Um sicherzustellen, dass Sie die andere Seite verstehen, denken Sie zunächst daran, dass der Ärger, den Sie empfinden, wenn Sie die Funktion ausschalten, der Ärger ist, den sie empfinden würden , wenn sie sich aus dem Weg räumen müssten , um die Funktion einzuschalten das Merkmal.

Kombinieren Sie das oben Genannte mit der Tatsache, dass genügend bashBenutzer die Funktion verwenden. Vorschläge zum Entfernen oder Deaktivieren der Funktion stoßen auf Widerstand von Personen, die bereits damit vertraut sind, dass die Funktion standardmäßig vorhanden ist.

Dies bashist auch die Standard-Shell für viele Benutzer (nicht nur im Sinne der Standard-Anmeldung oder der System-Shell, sondern auch im psychologischen Sinne). Wenn Ihr Referenzrahmen für das Zitieren von Muscheln ist bash, wenn dies die Muschel ist , die Sie zuerst gelernt haben, wird sich die Tatsache, dass !es sich um eine spezielle Muschel handelt, für Sie natürlich und automatisch anfühlen (oder zumindest, wenn Sie sie zum ersten Mal lernen, wird es nur ein Teil von sein Die Art und Weise, wie die Schale ist, ist nur eine Eigenheit, die man unter vielen akzeptieren muss.

Und wenn Sie darüber nachdenken, bashbegegnen viele Benutzer der Verlaufssubstitutionssyntax wahrscheinlich in einem positiven Kontext: Sie lesen darüber oder jemand zeigt es ihnen und sie erkennen den möglichen Nutzen davon, wenn sie zum ersten Mal lernen bash.

Es kommt nur aus der peripheren Welt anderer Bourne-artiger Muscheln, dass Sie gebissen werden !, wenn Sie etwas Besonderes sind, und daher geneigt sind, es negativ zu sehen: Denn wenn Sie an Muscheln gewöhnt sind, bei denen Sie das Feature nie hatten, dann Ihre erste Wenn Sie versuchen, etwas in Eile zu erledigen, wird es Sie verärgern.

TL; DR: Den meisten Benutzern ist es wahrscheinlich egal, wie die Standardeinstellung lautet. Einige Benutzer mögen das Feature und haben den großen Vorteil, dass es bereits so ist, und es gab nicht genügend Leute, die sich aktiv gegen das Feature aussprechen das überwinden.

mtraceur
quelle
2
Nein, es kommt nicht nur von anderen Muscheln. Ich habe diese Funktion seit Jahren bekannt , in bashund nach wie vor überrascht gebissen, als einzelne zitiert funktioniert nicht immer auf , !weil der gebrochenen bashUmsetzung.
Philippos
@Philippos Das ist furchterregend (naja, nicht gerade furchterregend ... aber irgendwie quälend negativ). Vielen Dank für den Hinweis. Ich werde versuchen, diese Antwort später noch einmal zu wiederholen, um Ihren Punkt in meine Antwort zu integrieren, sobald ich mir eine gute Möglichkeit überlegt habe, sie zu integrieren.
mtraceur
2

Warum ist die Ersetzung des Bash-Verlaufs weiterhin standardmäßig aktiviert?

Weil viele Leute es benutzen und Leute, die eine interaktive Bash-Shell benutzen, wahrscheinlich die Regeln kennen sollten , um Probleme zu vermeiden, und im Allgemeinen finden, dass es mehr hilft, als weh tut.

Mein .bashrc enthält set + H seit vielen Jahren, aber einige andere Leute werden immer noch von dieser Funktion gebissen.

Es handelt sich also um eine Funktion, die Sie nicht verwenden. Dies bedeutet nicht, dass die Mehrheit der Benutzer sie nicht verwendet. Sie können beantragen, dass die Standardeinstellung geändert wird, aber Sie müssen sich A) den Anteil der Personen ansehen, die sich darum kümmern , und B) das Verhältnis der Personen, die es auf Ihre Weise bevorzugen. Die Leute, die sich darum kümmern und es nicht mögen, haben es wahrscheinlich bereits deaktiviert. Eine Änderung würde helfen, wenn sie ein Konto auf einem neuen Computer erhalten. Leute, die sich darum kümmern und es mögen, müssten ihre Einstellungen auf jedem Computer aktualisieren, den sie benutzen, und auf jedem Konto, das sie in Zukunft erhalten.

Angesichts der Tatsache, dass so gut wie alle Benutzer Terminals mit Copy-Paste-Funktionen verwenden

Eine klobigere Option meiner Meinung nach ...

Gibt es wirklich einen Grund, das Feature überhaupt zu haben? Keines der vorhandenen Skripte würde beschädigt, selbst wenn dies standardmäßig für alle Shells deaktiviert wäre.

Ja, die Leute finden es nützlich. Was nützt eine Fernbedienung, wenn Sie früher nur aufstehen und den Kanal wechseln konnten?

(Offensichtlich hat die Funktion schwerwiegende Probleme, wenn sie standardmäßig für alle Skripte deaktiviert ist und eine Funktion zur Überprüfung der Ergebnisse vor der Ausführung vorhanden ist: shopt -s histverify.)

Verlauf ist in Skripten nicht wirklich sinnvoll, aber was noch wichtiger ist, es kann Sicherheitsprobleme verursachen. In Ihrem Fall könnten Sie das Problem vermeiden, indem Sie einfache Anführungszeichen verwenden. Ich erinnere mich nicht, dass dies jemals ein Problem für mich verursacht hat, daher weiß ich nicht, wie man sagen kann, dass es "Hauptprobleme" hat. Hat dies ein tatsächliches Problem für Sie verursacht, oder haben Sie sich darüber geärgert, dass Sie Ihre Standardeinstellungen auf einem neuen Computer vornehmen mussten?

Ich verstehe nicht, wie es anders ist, als zu fliehen oder einfache Anführungszeichen zu verwenden, wenn Sie tatsächlich etwas Geld bekommen möchten:

$ echo "Give me $50 or the cat gets it"
Give me $0 or the cat gets it
Jason Goemaat
quelle
2
Siehe dazugehörige Fragen (rechte Spalte); Die meisten Fragen treffen versehentlich auf diese Funktion und gehen davon aus, dass die Shell beschädigt ist. Ich persönlich habe vor langer Zeit von dieser Funktion erfahren, weil ich versehentlich eine Zeichenfolge verwendet habe, die zu einer falschen Ausgabe geführt hat. Ich wäre von gerettet worden, shopt -s histverifyaber das war nicht standardmäßig aktiviert. Darüber hinaus ist es ziemlich schwierig, die Ursache selbst herauszufinden, da die Fehlermeldung kryptisch ist ("Ereignis nicht gefunden") und die auslösende Zeichenfolge schwer zu finden ist.
Mikko Rantalainen
1
Die Leute werden von dieser Funktion wirklich gebissen, weil die "universellen" Shell-Syntax-Funktionen wie $"Special Inside" "..."eines der ersten Dinge sind, die die Leute über Shell lernen, während die Tatsache, dass !Special Inside "..."(aber nur im interaktiven Modus) weniger allgemein bekannt ist nicht als sofort / prominent unterrichtet, und ist bash-spezifisch. Außerdem weisen Bourne-ähnliche Shells meist eine Symmetrie zwischen Text in einem Skript und Text auf der interaktiven Shell auf, sodass Sie im Allgemeinen von einer Shell zur anderen kopieren können und diese gleich funktioniert - und diese Funktion erstellt eine der wenigen ausnahmen.
mtraceur
1
Ich verstehe nicht, wie es anders ist, als einfache Anführungszeichen verwenden zu müssen. Wahr zsh, wenn einfache Anführungszeichen! immer funktionieren, aber nicht bash, wenn die Implementierung unerwartete Ergebnisse liefert . Sie sagen, wir sollten die Regeln kennen , wussten Sie, dass diese verknüpfte Regel?
Philippos