[gelöst] Was versteht Bash unter »(shell) expansion«?

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
bullgard
Beiträge: 1642
Registriert: 14.09.2012 23:03:01

[gelöst] Was versteht Bash unter »(shell) expansion«?

Beitrag von bullgard » 11.08.2022 07:50:56

[Debian stable Xfce 4.16]
'man bash' verwendet 238 Mal den Begriff »expansion«.
https://www.gnu.org/software/bash/manua ... sions.html:
3.5 Shell Expansions; Expansion is performed on the command line after it has been split into tokens.
Was ist hier gemeint mit
expansion
?
Ich spreche nicht über
parameter expansion
und andere expansion-Spezialfälle, die Bash behandelt, sondern die fast 238 anderen Vorkommen von expansion in der Ausgabe von

Code: Alles auswählen

~$ man bash
Ich habe keine ISO-Definition für die IT für expansion gefunden.

Code: Alles auswählen

~$ man bash
(abgerufen 2022-08-09) gibt aus:
** EXPANSION **
Expansion is performed on the command line after it has been split into words. There are seven kinds of expansion performed: brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, word splitting, and pathname expansion.
The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and pathname expansion.
On systems that can support it, there is an additional expansion available: process substitution. This is performed at the same time as tilde, parameter, variable, and arithmetic expansion and command substitution.
After these expansions are performed, quote characters present in the original word are removed unless they have been quoted themselves (quote removal).
Only brace expansion, word splitting, and pathname expansion can increase the number of words of the expansion; other expansions expand a single word to a single word. The only exceptions to this are the expansions of "$@" and "${name[@]}", and, in most cases, $* and ${name[*]} as explained above (see PARAMETERS).
Das sind ja nur ~7 Spezialfälle.
Oder ist es so, wie mir ein Regular schrieb?:
Bash is a cobbled-together Rube Goldberg pile of garbage.
Gruß
bullgard
Zuletzt geändert von bullgard am 12.08.2022 13:13:08, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Was versteht Bash unter »(shell) expansion«?

Beitrag von Meillo » 11.08.2022 08:11:18

``Expansion'' ist ein typischer Spezialbegriff, der bei der Shell verwendet wird. Das hat sich halt so eingebuergert. Inhaltlich gemeint, ist schlichtweg irgend eine Art von Ersetzung. Ein Ausdruck wird durch seinen Wert ersetzt.

Jedenfalls ist ``expansion'' ein generischer Begriff und kein spezieller, darum gibt es verschiedene Arten von Expansions.

In dem von dir verlinkten Dokument heisst es ``command substitution'', in anderen Manpages, z.B. von der mksh, wird dies auch ``command expansion'' genannt. Das zeigt die Austauschbarkeit dieser Begriffe.

Die Verwendung des Begriffs ``expansion'' ist einfach Shell-Kultur.

Hier https://minnie.tuhs.org/pipermail/tuhs/ ... 25137.html ist diese Begriffskultur auch mal kommentiert worden (ausgehend von ``interpolating a register'' in der Dokumentation von troff). In manchen Kontexten halten sich eben manche Spezialbegriffe, auch wenn sie sonst niemand verwendet ...
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Was versteht Bash unter »(shell) expansion«?

Beitrag von Meillo » 11.08.2022 08:18:55

Falls du uebrigens verstehen oder zumindest nachvollziehen willst, warum die Shell so ist wie sie ist, dann finde ich diesen Vortrag von Stephen R. Bourne (dem Entwickler derjenigen Shell, die die Basis aller modernen Shells darstellt) wertvoll:

https://www.youtube.com/watch?v=FI_bZhV7wpI


Falls man es schafft, sich ueber die eigene Jammerei hinwegzusetzen, und versucht, tatsaechlich zu ueberlegen, wie die Alternativen zu den Designentscheidungen ausgesehen haetten, dann kann man dabei feststellen, dass -- obgleich man viel ueber die Shell motzen kann -- sie doch vieles gut macht und es gar nicht so einfach ist, es besser zu machen.
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Was versteht Bash unter »(shell) expansion«?

Beitrag von MSfree » 11.08.2022 08:21:21

Meillo hat geschrieben: ↑ zum Beitrag ↑
11.08.2022 08:11:18
Jedenfalls ist ``expansion'' ein generischer Begriff und kein spezieller, darum gibt es verschiedene Arten von Expansions.
Expansion kommt ja von ausdehnen und unterscheidet sich von Substitution, also ersetzen.

Gibt man z.B. *.jpg auf der Kommandozeile ein, so dehnt die Shell diesen Ausdruck aus und erzeugt eine Liste mit allen Dateien, die auf ".jpg" enden, das einfache Argument "*.jpg" wird also ausgedehnt.

Eine Substitution wäre z.B., wenn man eine Umgebungsvariable auf die Kommandozeile schreibt. So wird z.B. $HOME durch das Benutzerverzeichnis eresetzt, also z.B. durch /home/MSfree.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Was versteht Bash unter »(shell) expansion«?

Beitrag von Meillo » 11.08.2022 08:51:50

MSfree hat geschrieben: ↑ zum Beitrag ↑
11.08.2022 08:21:21
Meillo hat geschrieben: ↑ zum Beitrag ↑
11.08.2022 08:11:18
Jedenfalls ist ``expansion'' ein generischer Begriff und kein spezieller, darum gibt es verschiedene Arten von Expansions.
Expansion kommt ja von ausdehnen und unterscheidet sich von Substitution, also ersetzen.

Gibt man z.B. *.jpg auf der Kommandozeile ein, so dehnt die Shell diesen Ausdruck aus und erzeugt eine Liste mit allen Dateien, die auf ".jpg" enden, das einfache Argument "*.jpg" wird also ausgedehnt.

Eine Substitution wäre z.B., wenn man eine Umgebungsvariable auf die Kommandozeile schreibt. So wird z.B. $HOME durch das Benutzerverzeichnis eresetzt, also z.B. durch /home/MSfree.
Das ist jetzt natuerlich eine Frage von Begrifflichkeiten und Denkweisen. Fuer mich wird `*.jpg' ebenso ersetzt, naemlich durch `a.jpg b.jpg, c.jpg'. Gleichermassen wie bei Variablen wird ein Ausdruck durch seinen Wert ersetzt. Dieser Wert kann kuerzer oder laenger sein. Ggf. wird ja `[a-z][01234].jpg' nur durch `a1.jpg' ersetzt, was kuerzer ist. Waehrend im Fall von `$HOME' das ersetzte/ausgedehnte Ergebnis laenger ist.

Dieser Art ist auch die Argumentation in der von mir oben schon verlinkten Mail:
https://minnie.tuhs.org/pipermail/tuhs/2022-January/025137.html hat geschrieben: I prefer it to a popular alternative, "expansion", which is
misleading--especially to novices, who then make the reasonable
assumption, given the everyday meaning of that word, that whatever
results from the process will be larger in some sense than what was
there before.

IMO ist es am hilfreichsten, es so zu verstehen, dass ein Ausdruck durch seinen Wert ersetzt wird. Das kann auf verschiedene Weisen passieren, weil es verschiedene Arten von Ausdruecken gibt:

- eine Variable durch ihren Wert
- ein Globbing-Ausdruck durch eine Liste von Dateinamen
- ein Shell-Befehl durch seine Ausgabe
- ein mathematischer Ausdruck durch sein Rechenergebnis
- eine Stringbearbeitung auf einer Variablen durch ihr Resultat
- eine Stringgenerierungsanweisung durch die entstehenden Kombinationen
- ...

Das ist letztlich wie Macro-Verarbeiten: Diese Ausdruecke/Macros werden ersetzt/expandiert, so dass an deren Stelle ihr Wert bzw. dynamisch erzeugter Ersatztext steht. Es wird also der Inputtext bearbeitet und dann so getan wie wenn er schon zu Beginn so waere. Die Expansionen in der Shell sind so gesehen wie der CPP bei C-Quellcode.
Use ed once in a while!

fischig
Beiträge: 3600
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Was versteht Bash unter »(shell) expansion«?

Beitrag von fischig » 11.08.2022 13:07:13

sich ueber die eigene Jammerei hinwegzusetzen
...
viel ueber die Shell motzen
Ich sehe nicht, wo der TE sich emotional ablehnend über die shell äußert, er fragt lediglich nach einer seiner Meinung nach verwirrenden Begrifflichkeit in der Dokumentation. Und solange man das lästig findet, wird sich da auch nichts ändern. Das kann man sich auch schön reden/schreiben.
Ein schönes Beispiel, wohin das führt, findet sich gerade hier: viewtopic.php?t=184737

DeletedUserReAsG

Re: Was versteht Bash unter »(shell) expansion«?

Beitrag von DeletedUserReAsG » 11.08.2022 13:15:12

MSfree hat geschrieben: ↑ zum Beitrag ↑
11.08.2022 08:21:21
Expansion kommt ja von ausdehnen und unterscheidet sich von Substitution, also ersetzen.
Dann kann für dich ja nur Folgendes eine Expansion sein:

file.txtfile.txt

Alles, was in der Shell als „Expansion“ bezeichnet wird, ist tatsächlich in jedem Fall „nur“ eine Ersetzung, und wäre daher nach deinem Maßstab als Substitution zu bezeichnen: bei *.jpga.jpg, b.jpg wird ja das „*“ durch „a“ und „b“ ersetzt ;)

bullgard
Beiträge: 1642
Registriert: 14.09.2012 23:03:01

Re: [gelöst] Was versteht Bash unter »(shell) expansion«?

Beitrag von bullgard » 12.08.2022 13:15:42

Vielen Dank für Eure prima Antworten, die sehr zum Verständnis beigetragen haben!
Gruß
bullgard

Antworten