Welche Bash-Shell-Optionen werden vom Parser verwendet?

Welche Bash-Shell-Optionen werden vom Parser verwendet?

Wenn wir unseren Fokus ausschließlich auf beschränken bash,diese AntwortAuf Stack Overflow wird Folgendes berichtet.

extglobist eine verwendete Flaggevom Parser. Funktionen, zusammengesetzte Befehle usw. werden vor der Ausführung vollständig analysiert. Daher extglobmuss es festgelegt werden, bevor der Inhalt analysiert wird. Wenn es zur Ausführungszeit, aber nach der Analyse festgelegt wird, hat dies keine Auswirkung auf zuvor analysierte Inhalte.

Aus diesem Grund können Sie es auch nicht shopt -s extglob; ls !(*.txt)als Einzeiler ausführen (wenn extglobes zuvor nicht festgelegt wurde), sondern es muss eine neue Zeile zwischen den beiden Befehlen vorhanden sein.

Dies gilt jedoch nicht für andere Shell-Optionen. Betrachten Sie beispielsweise Folgendes.

$ ls -a
.  ..  .hiddenFile  file1  file2  file3
$ shopt dotglob
dotglob         off
$ echo *
file1 file2 file3
$ shopt -s dotglob; echo *
.hiddenFile file1 file2 file3

Ist irgendwo dokumentiert, welche Shell-Optionen vom Parser verwendet werden extglobund daher nicht innerhalb eines Gruppenbefehls aktiviert werden können, der sie verwendet?

ImshoptSeite im bashHandbuchÜber das oben beschriebene Verhalten scheint nichts erwähnt zu sein.

Antwort1

Ist irgendwo dokumentiert, welche Shell-Optionen vom Parser wie extglob verwendet werden und daher nicht innerhalb eines Gruppenbefehls aktiviert werden können, der sie verwendet?

Es ist schwer, etwas Negatives zu beweisen, aber ich bezweifle, dass es eine umfassende Liste gibt.

Die von mir gefundenen Fehler, die sich auf die Analyse auswirken, sind unten aufgeführt. Möglicherweise gibt es noch weitere:

  • extglob-- ändert die Bedeutung der Klammern, die sonst ein Sonderzeichen sind
  • expand_aliases-- Aliase werden ziemlich früh in der Verarbeitung erweitert
  • extquote-- verändert die Bedeutung einiger Zitate
  • interactive_comments-- ändert die Bedeutung #am Wortanfang.

Einige der compat*Optionen haben möglicherweise ähnliche Auswirkungen, aber das Testen überlasse ich jemandem, der mehr Interesse hat.

Andererseits wirken sich Dinge wie und nur auf das Ergebnis eines Globs aus, nicht aber darauf, wie es analysiert wird dotglob.failglobglobstar

In Bezug auf ist extglobeine Befehlszeile wie !(foo)entweder mit oder ohne Set gültig extglob. Mit Set ist es ein Glob, der mit allen Dateien außer übereinstimmt foo, und ohne Set ist es eine Subshell, die den Befehl ausführt foo, wobei der Rückgabewert invertiert ist.


Beachten Sie, dass dies in der Praxis kein Problem darstellen sollte. In einem Skript können Sie den shoptBefehl in eine eigene Zeile setzen, sodass Änderungen beim Parsen sich ohne Probleme auf die nächste Zeile auswirken. In einem Einzeiler können Sie die -OOption in der Befehlszeile verwenden, z. B. bash -O extglob -c 'echo !(foo)'funktioniert in der erweiterte Glob.

verwandte Informationen