„apt-get“ und Platzhalter: Globs vs. reguläre Ausdrücke

„apt-get“ und Platzhalter: Globs vs. reguläre Ausdrücke

Bearbeiten: Bitte beachten Sie, dass mir, wie unten geschrieben, Antworten auf dieser Site bekannt sind, die erklären, dass apt-getzur Interpretation von Paketnamen Regex verwendet wird. Tatsächlich geht es bei der Frage direkt darum, inwiefern sich das tatsächliche Verhalten von dem dokumentierten unterscheidet. Bitte lesen Sie die Frage, bevor Sie ein Duplikat vorschlagen.


Einige Antworten auf dieser Site warnen vor der Verwendung apt-getvon Platzhaltern (z. B. Sternchen: *), da apt-getdiese angeblich als reguläre Ausdrücke erweitert werden, was zu unerwarteten (und unerwünschten) Ergebnissen führen kann, insbesondere mit apt-get remove. TatsächlichUbuntu- manSeite fürapt-getlautet:

Wenn kein Paket mit dem angegebenen Ausdruck übereinstimmt und der Ausdruck eines der Zeichen '.', '?' oder '*' enthält, wird davon ausgegangen, dass es sich um einen POSIX-regulären Ausdruck handelt, und er wird auf alle Paketnamen in der Datenbank angewendet. Alle Übereinstimmungen werden dann installiert (oder entfernt). Beachten Sie, dass die Übereinstimmung nach Teilzeichenfolge erfolgt, sodass 'lo.*' mit 'how-lo' und 'lowest' übereinstimmt. Wenn dies unerwünscht ist, verankern Sie den regulären Ausdruck mit einem '^'- oder '$'-Zeichen oder erstellen Sie einen spezifischeren regulären Ausdruck.

Tatsächlich,diese AntwortAnsprüche:

apt-get akzeptiert als Shell einen regulären Ausdruck und kein Glob-Muster.

Ich glaube, das ist falsch (zumindest seit Xenial). Ich kann beispielsweise das folgende Verhalten reproduzieren:

$ sudo apt-get install -s 'meld*'
[...]
Note, selecting 'meld' for glob 'meld*'
[...]

$ sudo apt-get install -s 'meldt*'
[...]
Note, selecting 'python-meld3' for regex 'meldt*'
Note, selecting 'python3-meld3' for regex 'meldt*'
Note, selecting 'meld' for regex 'meldt*'
[...]

(Ich habe keine Übereinstimmungen entfernt, nur irrelevante Teile der apt-getAntwort.)

Aufgrund dieses Verhaltens scheint es mir so, dass apt-getzunächst versucht wird, die angegebenen Ausdrücke als Globs abzugleichen und nur wenn dies fehlschlägt, ein erneuter Versuch als reguläre Ausdrücke durchgeführt wird.

Habe ich das richtig verstanden? Habe ich die manSeite falsch verstanden oder ist dieses Verhalten schlecht dokumentiert?

Antwort1

Dies wird erläutert in derapt(8)manpage:

install, remove, purge (apt-get(8))
   Performs the requested action on one or more packages specified via
   regex(7), glob(7) or exact match. The requested action can be
   overridden for specific packages by append a plus (+) to the
   package name to install this package or a minus (-) to remove it.

Dieser Absatz existiert nicht in der15.10 manpage, also könnte es in 16.04 hinzugefügt worden sein.

Dies scheint im Änderungsprotokoll von apt nicht erwähnt worden zu sein -der Commit, der dies 2013 hinzugefügt hatzeigt keine Änderungen in den Manpages. Dies wurde kurzzeitig deaktiviert und später wieder aktiviert (sieheCommits zwischen Mai und Februar 2014), UndDie Deaktivierung ist im Changelog aufgeführt..

Dies mag zwar vor vier Jahren hinzugefügt worden sein, abererst 2015 dokumentiert. Und apt-getdie Manpage von bleibt vernachlässigt.

verwandte Informationen