add brace expansion
- a{b,c}d, nested braces, empty alternatives (file{,.bak})
- sequences {1..5}, {5..1}, {1..10..3}, zero-padded {01..10}, letters
{a..e}
- happens first on the command text, the results go through ~,
variable and wildcard expansion
- quoted/escaped braces, ${...} and braces without comma or valid
sequence are kept; \, protects a comma
- a redirection target must expand to one word (ambiguous redirect),
a word may expand to at most 100000 words
- completion escapes { in file names
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
da281ca4ab
commit
b3311cbf94
4 files changed
+424
-1
No files matched your search
@@ -30,6 +30,7 @@ Features:
|
||||
override with $GOSH_HISTFILE); lines starting with a space are not saved
|
||||
- Tab completion for commands and file paths
|
||||
- Tilde expansion (~, ~/path) at the start of unquoted words
|
||||
- Brace expansion: a{b,c}d -> abd acd, {1..5}, {01..10..2}, {a..e}
|
||||
- Wildcards: * ? [abc] [a-z] [!abc] match file names (not hidden files
|
||||
unless the pattern starts with a dot); quoted wildcards and values of
|
||||
variables are not expanded, a pattern without match is kept as is
|
||||
@@ -142,6 +143,35 @@ Status 127
|
||||
|
||||
Schlägt ein Programm fehl, gibt gosh selbst keine Meldung mehr aus (das Programm meldet den Fehler selbst), nur bei Fehlern von gosh, z. B. wenn ein Befehl nicht gefunden wird.
|
||||
|
||||
### Klammer-Expansion
|
||||
|
||||
Wie in bash erzeugt `{…}` aus einem Wort mehrere Wörter:
|
||||
|
||||
| Ausdruck | ergibt |
|
||||
|-------------------|---------------------------------|
|
||||
| `a{b,c}d` | `abd acd` |
|
||||
| `file{,.bak}` | `file file.bak` |
|
||||
| `{a,b}{1,2}` | `a1 a2 b1 b2` |
|
||||
| `x{a,{b,c}}` | `xa xb xc` (verschachtelt) |
|
||||
| `{1..5}` | `1 2 3 4 5` |
|
||||
| `{5..1}` | `5 4 3 2 1` |
|
||||
| `{1..10..3}` | `1 4 7 10` (Schrittweite) |
|
||||
| `{01..10..4}` | `01 05 09` (mit führenden Nullen) |
|
||||
| `{a..e}` | `a b c d e` |
|
||||
|
||||
```
|
||||
$ mkdir -p projekt/{src,doc,test}
|
||||
$ cp config.yaml{,.bak} # Sicherungskopie
|
||||
$ ls *.{go,md}
|
||||
$ touch log-{01..12}.txt
|
||||
```
|
||||
|
||||
- Die Klammer-Expansion kommt zuerst, die Ergebnisse durchlaufen danach `~`, Variablen und Wildcards: `*.{go,md}` wird zu `*.go *.md`, `{${A},b}` zu `$A b`.
|
||||
- Ohne Komma (und ohne gültige Folge) bleiben Klammern stehen: `{a}`, `{}`, `{a..1}`. Auch `${VAR}` wird nicht angefasst.
|
||||
- In Anführungszeichen oder mit `\` davor sind die Zeichen normale Zeichen: `"{a,b}"`, `\{a,b\}`. Ein Komma lässt sich mit `\,` schützen: `{a\,b,c}` ergibt `a,b c`.
|
||||
- Bei einer Umleitung muss genau ein Wort herauskommen, `> {a,b}` meldet `ambiguous redirect`.
|
||||
- Ein Wort darf höchstens 100 000 Wörter erzeugen.
|
||||
|
||||
### Wildcards
|
||||
|
||||
Wörter mit `*`, `?` oder `[...]` werden durch die passenden Dateinamen ersetzt, sortiert:
|
||||
|
||||
Reference in new issue
Block a user