Weiß jemand, warum in der Bash immer noch die Ersetzung des Verlaufs standardmäßig aktiviert ist? Meine .bashrc
hat set +H
fü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 readline
Bibliotheks- 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:
quelle
ls -l foo/bar/baz/weeble.cpp
mitless !$
als Rückruf der Befehl und bearbeiten es.&
? 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.!$
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.Antworten:
Wenn Sie bereits mit den
bash
Ersetzungsmustern 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
$HISTFILE
macht 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
bash
Entwickler von großer Bedeutung wäre ). Sie scheinen zu glauben, dass die meistenbash
Benutzer 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 +H
Ihre Arbeit mit Ihrer~/.bashrc
Datei fort, oder fordern Sie diebash
Entwickler auf, die Standardeinstellung zu ändern (was meines Erachtens mehr Leute verärgern und verwirren würde, als helfen würde) ).quelle
bash
Benutzer 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 diebash
Mailingliste senden . Siehe savannah.gnu.org/mail/?group=bash!
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.!
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 ash
bash
bash
Die Ersetzung des Verlaufs ist nützlich. Nimm zum Beispiel
quelle
.bashrc
.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
bash
Benutzer 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
bash
ist 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 istbash
, 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,
bash
begegnen 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 lernenbash
.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.
quelle
bash
und nach wie vor überrascht gebissen, als einzelne zitiert funktioniert nicht immer auf ,!
weil der gebrochenenbash
Umsetzung.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.
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.
Eine klobigere Option meiner Meinung nach ...
Ja, die Leute finden es nützlich. Was nützt eine Fernbedienung, wenn Sie früher nur aufstehen und den Kanal wechseln konnten?
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:
quelle
shopt -s histverify
aber 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.$
"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 istbash
-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.zsh
, wenn einfache Anführungszeichen!
immer funktionieren, aber nichtbash
, wenn die Implementierung unerwartete Ergebnisse liefert . Sie sagen, wir sollten die Regeln kennen , wussten Sie, dass diese verknüpfte Regel?