annotate cut.txt @ 8:1dc4a9dca829

Zwischenstand
author markus schnalke <meillo@marmaro.de>
date Tue, 05 May 2015 09:04:00 +0200
parents 21ca59543b07
children e67bd0d48bd6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
1 Das Werkzeugkaestle, #1
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
2
6
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
3 cut - cut out selected fields of each line of a file
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
4 ----------------------------------------------------
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
5 markus schnalke <meillo@marmaro.de>
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
6 2015-05
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
7
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
8
1
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
9 Cut ist ein klassisches Programm im Unix-Werkzeugkasten.
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
10 In keinem ordentlichen Tutorial zur Shellprogrammierung fehlt
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
11 es. Es ist ein schoenes Anschauungsobjekt fuer's Shellscripting.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
12 Hier soll ein wenig hinter die Fassade von cut geschaut werden.
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
13
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
14
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
15 Funktionsweise
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
16
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
17 Urspruenglich hatte cut zwei Modi, die spaeter um einen dritten
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
18 erweitert wurden. Cut schneidet entweder bestimmte Zeichen aus
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
19 den Zeilen der Eingabe oder bestimmte, durch Trennzeichen
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
20 definierte, Felder.
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
21
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
22 Der Zeichenmodus ist geeignet um Festbreitenformaten zu
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
23 zerteilen. So kann man damit beispielsweise bestimmte
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
24 Zugriffsrechte aus der Ausgabe von `ls -l' ausschneiden. Hier
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
25 die Rechte des Besitzers:
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
26
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
27 $ ls -l foo | cut -c 2-4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
28 rw-
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
29
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
30 Oder die Schreibrechte des Besitzers, der Gruppe und der
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
31 Welt:
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
32
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
33 $ ls -l | cut -c 3,6,9
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
34 ww-
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
35
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
36 Mit cut lassen sich aber auch Strings kuerzen.
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
37
6
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
38 $ echo "$long" | cut -c -20
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
39
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
40 Dieser Befehl gibt die ersten maximal 20 Zeichen von
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
41 `$long' aus. (Alternativ kann man hierfuer auch `printf
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
42 "%.20s\n" "$long"' verwenden.)
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
43
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
44 Geht es aber nicht um die Darstellung von Zeichen, sondern um
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
45 ihre Speicherung, dann ist `-c' nicht unbedingt geeignet.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
46 Frueher, als US-ASCII als Zeichensatz und -kodierung
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
47 noch omnipraesent war, wurde jedes Zeichen mit genau einem
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
48 Byte gespeichert. Somit selektierte `cut -c' gleichermassen
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
49 sowohl Ausgabezeichen als auch Bytes. Mit dem Aufkommen von
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
50 Multibyte-Kodierungen (wie UTF-8) musste man sich jedoch von
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
51 dieser Annahme loesen. In diesem Zug bekam cut mit
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
52 POSIX.2-1992 einen Bytemodus mit der Option `-b'. Will man
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
53 also nur die ersten maximal 500 Bytes vor dem
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
54 Newline-Zeichen stehen haben (und den Rest stillschweigend
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
55 ignorieren), dann macht man das mit:
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
56
6
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
57 $ cut -b -500
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
58
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
59 Den Rest kann man sich mit `cut -b 501-' einfangen. Diese
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
60 Funktion ist insbesondere fuer POSIX wichtig, da man so
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
61 Textdateien mit begrenzter Zeilenlaenge erzeugen kann.
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
62 [ http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html#tag_20_28_17
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
63
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
64 Neben dem Zeichen- bzw. Byte-Modus bietet cut noch den
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
65 Feld-Modus, den man mit `-f' einleitet. Mit ihm
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
66 koennen Felder ausgewaehlt werden. Das Trennzeichen (per
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
67 Default der Tab) kann mit `-d' geaendert werden.
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
68
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
69 Der typische Anwendungsfall fuer cut im Feld-Modus ist die
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
70 Auswahl von Information aus der passwd-Datei. So z.B. der
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
71 Benutername, seine ID und das Homeverzeichnis:
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
72
6
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
73 $ cut -d: -f1,3,6 /etc/passwd
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
74
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
75 (Die Argumente fuer die Optionen koennen bei cut uebrigens
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
76 mit Whitespace abgetrennt oder direkt angehaengt folgen.)
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
77
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
78
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
79 Dieser Feld-Modus ist fuer einfache tabellarische Dateien,
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
80 wie eben die passwd, gut geeignet. Er kommt aber schnell an
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
81 seine Grenzen. Gerade der uebliche Fall, dass an Whitespace
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
82 in Felder geteilt werden soll, wird damit nicht abgedeckt.
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
83 Der Delimiter kann nur genau ein Zeichen sein. Es kann also
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
84 nicht sowohl an Leerzeichen als auch an Tabs getrennt werden.
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
85 Auch unterteilt cut an jedem Trennzeichen. Zwei aneinander
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
86 stehende Trennzeichen fuehren zu einem leeren Feld. Dieses
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
87 Verhalten widerspricht den Erwartungen, die man an die
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
88 Verarbeitung einer Datei mit Whitespace-getrennten Feldern
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
89 hat. Manche Implementierungen von cut, z.B. die von FreeBSD,
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
90 haben Erweiterungen, die das gewuenschte Verhalten fuer
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
91 Whitespace-getrennte Felder bieten. Ansonsten, d.h. wenn
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
92 man portabel bleiben will, hilft awk.
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
93
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
94 Awk bietet noch eine weitere Funktion, die cut missen
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
95 laesst: Das Tauschen der Feld-Reihenfolge in der Ausgabe. Bei
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
96 cut ist die Reihenfolge der Feldauswahlangabe irrelevant; ein
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
97 Feld kann selbst mehrfach angegeben werden. So gibt der Aufruf
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
98 von `cut -c 5-8,1,4-6' die Zeichen Nummer 1, 4, 5, 6, 7 und 8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
99 in genau dieser Reihenfolge aus. Die Auswahl entspricht damit
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
100 der Mengenlehre in der Mathematik: Jedes angegebene Feld wird
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
101 Teil der Ergebnismenge sein. Die Felder der Ergebnismenge sind
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
102 dabei immer gleich geordnet wie sie es in der Eingabe waren.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
103 Oder, um die Worte der Manpage in Version 8 Unix
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
104 wiederzugeben: ``In data base parlance, it projects a relation.''
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
105 Cut fuehrt also die Datenbankoperation Projektion auf
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
106 Textdateien aus. Die Wikipedia erklaert das in
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
107 verstaendlicherer Sprache:
7
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
108
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
109 Die Projektion entspricht der Projektionsabbildung aus der
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
110 Mengenlehre und kann auch Attributbeschränkung genannt
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
111 werden. Sie extrahiert einzelne Attribute aus der
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
112 ursprünglichen Attributmenge und ist somit als eine Art
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
113 Selektion auf Spaltenebene zu verstehen, das heißt, die
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
114 Projektion blendet Spalten aus.
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
115
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
116 [ http://de.wikipedia.org/wiki/Projektion_(Informatik)#Projektion
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
117
7
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
118
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
119
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
120
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
121 Geschichtliches
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
122
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
123 Cut erblickte 1982 mit dem Release von UNIX System III das
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
124 Licht der oeffentlichen Welt. Wenn man die Quellen von System
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
125 III durchforstet, findet man die Quellcodedatei cut.c mit dem
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
126 Zeitstempel 1980-04-11.
1
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
127 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
128 Das ist die aelteste Manifestation des Programms, die ich
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
129 aufstoebern konnte. Allerdings spricht die sccsid im
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
130 Quellcode von Version 1.5. Es muss also noch eine
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
131 Vorgeschichte geben. Zu dieser habe ich leider keinen Zugang
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
132 gefunden.
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
133
1
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
134 Aber werfen wir doch einen Blick auf die BSD-Linie: Dort ist mein
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
135 fruehester Fund ein cut.c mit dem Dateimodifikationsdatum
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
136 1986-11-07
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
137 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-UWisc/src/usr.bin/cut
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
138 als Teil der Spezialversion 4.3BSD-UWisc,
6
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
139 [ http://gunkies.org/wiki/4.3_BSD_NFS_Wisconsin_Unix
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
140 die im Januar 1987 veroeffentlicht wurde.
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
141 Die Implementierung unterscheidet sich nur minimal von der
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
142 in System III.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
143 Im bekannteren 4.3BSD-Tahoe (1988) taucht cut nicht auf.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
144 Das darauf folgende 4.3BSD-Reno (1990) liefert aber wieder
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
145 ein cut mit aus. Dieses cut ist ein von Adam S. Moskowitz und
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
146 Marciano Pitargue neu implementiertes cut, das 1989 in BSD
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
147 aufgenommen wurde.
1
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
148 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
149 Seine Manpage
1
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
150 [ http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD-Reno/src/usr.bin/cut/cut.1
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
151 erwaehnt bereits die erwartete Konformitaet mit POSIX.2.
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
152 Nun sollte man wissen, dass POSIX.2 erst im September
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
153 1992 veroeffentlicht wurde, also gut zwei Jahren *nachdem* die
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
154 Manpage und das Programm geschrieben wurden. Das Programm
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
155 wurde also anhand von Arbeitsversionen des Standards
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
156 implementiert. Zweieinhalb Jahre Arbeit war immerhin schon in
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
157 den Standardisierungsprozess geflossen; bis zur
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
158 Fertigstellung sollte es aber noch weitere zwei Jahre dauern.
0
5efb052a0d9e Zwischenstand
markus schnalke <meillo@marmaro.de>
parents:
diff changeset
159
1
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
160 Trotz all dieser Jahreszahlen aus den 80er Jahren gehoert cut
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
161 aus Sicht des urspruenglichen Unix zu den juengeren Tools.
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
162 Wenn cut auch ein Jahrzehnt aelter als Linux, der Kernel, ist,
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
163 so war Unix doch schon ueber zehn Jahre alt, als cut das
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
164 erste Mal auftauchte. Insbesondere gehoerte cut noch nicht
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
165 zu Version 7 Unix, das die Ausgangsbasis aller modernen
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
166 Unix-Systeme darstellt. Die weit komplexeren Programme sed
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
167 und awk waren dort schon vertreten. Man muss sich also
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
168 fragen, warum cut ueberhaupt noch entwickelt wurde, wo es
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
169 schon zwei Programme gab, die die Aufgabe von cut abdeckten.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
170 Ein Argument fuer cut war sicher seine Kompaktheit und
4
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
171 die damit verbundene Geschwindigkeit gegenueber dem damals
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
172 traegen awk. Diese schlanke Gestalt ist es auch, die der Unix
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
173 Philosopie entspricht: Mache eine Aufgabe und die richtig!
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
174 So bewaehrte sich cut. Es wurde in andere Unix Varianten
d0b61c2bd25c Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 3
diff changeset
175 uebernommen, standardisiert und ist heutzutage ueberall
1
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
176 anzutreffen.
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
177
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
178 Die urspruengliche Variante (ohne -b) tauchte schon 1985 in
5
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
179 der System V Interface Definition, einer wichtigen formalen
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
180 Beschreibung von UNIX System V, und in allen relevanten
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
181 Standards seither auf. Mit POSIX.2 im Jahre 1992 wurde cut
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
182 zum ersten Mal in der heutigen Form (mit -b) standardisiert.
2
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
183
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
184
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
185
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
186 Multibyte-Behandlung
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
187
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
188 Nun sind der Bytemodus und die damit verbundene
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
189 Multibyte-Verarbeitung des POSIX-Zeichenmodus bereits seit
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
190 1992 standardisiert, wie steht es aber mit deren Umsetzung?
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
191 Welche Versionen implementieren denn den POSIX korrekt?
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
192 Die Situation ist mehrschichtig. Es gibt traditionelle
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
193 Implementierungen, die nur -c und -f kennen. Dann gibt es
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
194 Implementierungen die zwar -b kennen, es aber nur als Alias
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
195 fuer -c handhaben. Diese Implementierungen funktionieren mit
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
196 Single-Byte-Encodings (z.B. US-ASCII, Latin1) korrekt, bei
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
197 Multi-Byte-Encodings (z.B. UTF-8) verhaelt sich ihr -c aber
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
198 wie -b (und -n wird ignoriert). Schliesslich gibt es noch
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
199 Implementierungen, die -b und -c tatsaechlich POSIX-konform
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
200 implementieren.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
201
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
202 Traditionelle Zwei-Modi-Implementierungen sind z.B. die von
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
203 System III, System V und die aller BSDs bis in die 90er.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
204
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
205 Pseude-Multibyte-Implementierungen bieten GNU und die
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
206 modernen NetBSDs und OpenBSDs. Wie sehr dort der Schein von
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
207 POSIX-konformitaet gewahrt wird, ist unterschiedlich. Nicht
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
208 immer findet man klare Aussagen wie diese:
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
209
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
210 /* Since we don't support multi-byte characters, the -c and -b
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
211 options are equivalent, and the -n option is meaningless. */
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
212
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
213 [ XXX
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
214
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
215 Tatsaechlich standardkonforme Implementierungen, die
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
216 Multibytes korrekt handhaben, bekommt man bei einem modernen
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
217 FreeBSD und bei den Heirloom Tools. Bei FreeBSD hat Tim Robbins
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
218 (tjr) im Sommer 2004 den Zeichenmodus POSIX-konform reimplementiert.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
219 [ https://svnweb.freebsd.org/base?view=revision&revision=131194
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
220 Warum die beiden anderen grossen BSDs diese Aenderung nicht
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
221 uebernommen haben, bleibt offen. Es scheint aber an der im
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
222 obigen Kommentar formulierten Grundausrichtung zu liegen.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
223
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
224 Wie findet man als Nutzer heraus, ob beim cut(1) des eigenen
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
225 Systems Multibytes korrekt unterstuetzt werden? Zuerst ist
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
226 entscheidend, ob das System selbst mit einem Multibyte-Encoding
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
227 arbeitet, denn tut es das nicht, dann entsprechen sich Zeichen
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
228 und Bytes und die Frage eruebrigt sich. Man kann dazu nachschauen,
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
229 welches Locale eingestellt ist, aber einfacher ist es, ein
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
230 typisches Mehrbytezeichen, wie z.B. einen Umlaut, auszugeben
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
231 und zu schauen ob dieses in einem oder in mehreren Bytes
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
232 kodiert ist:
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
233
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
234 $ echo ä | od -c
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
235 0000000 303 244 \n
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
236 0000003
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
237
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
238 In diesem Fall sind es zwei Bytes: oktal 303 und 244 . (Den
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
239 Zeilenumbruch fuegt echo(1) hinzu.)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
240
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
241 Mit dem Programm iconv(1) kann man Test explizit in bestimmte
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
242 Kodierungen konvertieren. Hier Beispiele, wie das Ergebnis
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
243 bei Latin1 und wie es bei UTF-8 aussieht.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
244
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
245 $ echo ä | iconv -t latin1 | od -c
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
246 0000000 344 \n
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
247 0000002
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
248
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
249 $ echo ä | iconv -t utf8 | od -c
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
250 0000000 303 244 \n
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
251 0000003
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
252
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
253 Die Ausgabe auf dem eigenen System (ohne die iconv-Konvertierung)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
254 wird recht sicher einer dieser beiden Ausgaben entsprechen.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
255
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
256 Nun zum Test der cut-Implementierung. Hat man ein UTF-8-System,
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
257 dann sollte sich eine POSIX-konforme Implementierung so verhalten:
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
258
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
259 $ echo aä | ./cut -c -2 | od -c
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
260 0000000 a 303 244 \n
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
261 0000004
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
262
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
263 $ echo aä | ./cut -b -2 | od -c
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
264 0000000 a 303 \n
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
265 0000003
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
266
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
267 $ echo aä | ./cut -b -2 -n | od -c
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
268 0000000 a \n
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
269 0000002
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
270
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
271 Bei einer Implementierung, die -b und -c gleich behandelt,
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
272 ist die Ausgabe in allen drei Faellen wie die mittlere: Es
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
273 werden die ersten beiden Bytes ausgegeben.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
274
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
275
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
276
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
277 Implementierungen
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
278
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
279 Nun zum Blick auf den Code. Hier soll eine Auswahl an
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
280 Implementierungen etwas genauer betrachtet werden. Fuer einen
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
281 ersten Eindruck ist der Umfang des Quellcodes hilfreich.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
282 Typischerweise steigt dieser ueber die Jahre an. Diese
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
283 Beobachtung kann hier in der Tendenz, aber nicht in jedem Fall,
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
284 bestaetigt werden.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
285
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
286 Die Unterstuetzung des Byte-Modus (-b) erfordert zwangslaeufig
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
287 mehr Code, deshalb ist zu erwarten, dass diejenigen
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
288 Implementierungen, die ihn haben, umfangreicher sind.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
289
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
290 Codevergleich
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
291
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
292 SLOC Zeilen Bytes Gehoert zu Dateidatum Kategorie
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
293 -----------------------------------------------------------------
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
294 116 123 2966 System III 1980-04-11 (trad)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
295 118 125 3038 4.3BSD-UWisc 1986-11-07 (trad)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
296 200 256 5715 4.3BSD-Reno 1990-06-25 (trad)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
297 200 270 6545 NetBSD 1993-03-21 (trad)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
298 218 290 6892 OpenBSD 2008-06-27 (pseudo)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
299 224 296 6920 FreeBSD 1994-05-27 (trad)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
300 232 306 7500 NetBSD 2014-02-03 (pseudo)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
301 340 405 7423 Heirloom 2012-05-20 (POSIX)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
302 382 586 14175 GNU coreutils 1992-11-08 (pseudo)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
303 391 479 10961 FreeBSD 2012-11-24 (POSIX)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
304 588 830 23167 GNU coreutils 2015-05-01 (pseudo)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
305
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
306
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
307 $ awk -F' +' '{printf("%d\t%d (%.2f)\t%d (%.2f)\t%s\t%s\t%s\n",
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
308 $1, $2, $2/$1, $3, $3/$1, $4, $5, $6);}' <sloc
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
309 116 123 (1.06) 2966 (25.57) System III 1980-04-11 (trad)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
310 118 125 (1.06) 3038 (25.75) 4.3BSD-UWisc 1986-11-07 (trad)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
311 200 256 (1.28) 5715 (28.57) 4.3BSD-Reno 1990-06-25 (trad)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
312 200 270 (1.35) 6545 (32.73) NetBSD 1993-03-21 (trad)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
313 218 290 (1.33) 6892 (31.61) OpenBSD 2008-06-27 (pseudo)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
314 224 296 (1.32) 6920 (30.89) FreeBSD 1994-05-27 (trad)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
315 232 306 (1.32) 7500 (32.33) NetBSD 2014-02-03 (pseudo)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
316 340 405 (1.19) 7423 (21.83) Heirloom 2012-05-20 (POSIX)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
317 382 586 (1.53) 14175 (37.11) GNU coreutils 1992-11-08 (pseudo)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
318 391 479 (1.23) 10961 (28.03) FreeBSD 2012-11-24 (POSIX)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
319 588 830 (1.41) 23167 (39.40) GNU coreutils 2015-05-01 (pseudo)
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
320
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
321
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
322 Einige Auffaelligkeiten:
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
323
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
324 Das Kandidatenfeld teilt sich grob in vier Gruppen: Die zwei urspruenglichen
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
325 Implementierungen, die sich nur minimal unterscheiden, mit gut 100 SLOCs.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
326 Dann die fuenf BSD-Versionen mit knapp ueber 200 SLOCs. Anschliessend die
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
327 zwei POSIX-konformen Programme und die alte GNU-Version mit 350-400
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
328 SLOCs. Und zum Abschluss die moderne GNU-Variante mit fast 600 SLOCs.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
329
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
330 Die Abweichung von logischen Codezeilen (nach der Definition von
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
331 SLOCcount) und der Anzahl von Zeilenumbruechen in der Datei erstreckt
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
332 sich ueber einen Faktor von 1.06 bei den aeltesten Vertretern bis zu
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
333 Faktor 1.5 bei GNU.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
334
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
335 Betrachtet man die Abweichungen zwischen den logischen Codezeilen und der
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
336 Dateigroesse, so pendelt das Teilnehmerfeld zwischen 25 und 30 Bytes je
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
337 Anweisung. Die Heirloom-Implementierung weicht nach unten ab, die
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
338 GNU-Implementierungen nach oben.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
339
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
340
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
341
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
342 Das cut in System III von 1980 ist, wie man anhand der SCCS-ID erkennen
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
343 kann bereits in Version 1.5. Die Vorversionen konnte ich aber leider nicht
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
344 ermitteln.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
345
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
346 Schaut man sich die SCCS-IDs in den BSD-Quellen an, dann findet man dort
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
347 Versionsnummern, die die Entwicklung dokumentieren:
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
348
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
349 4.3bsd-uwisc "@(#)cut.c 1.3";
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
350 4.3bsd-reno "@(#)cut.c 5.3 (Berkeley) 6/24/90";
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
351 netbsd "@(#)cut.c 5.4 (Berkeley) 10/30/90";
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
352 freebsd "@(#)cut.c 8.1 (Berkeley) 6/6/93";
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
353
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
354 Die neueren BSD-Versionen enthalten zwar weiterhin eine SCCS-ID, diese
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
355 ist aber bei Version "8.3 (Berkeley) 5/4/95" stehen geblieben. Danach
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
356 wurde scheinbar von SCCS auf CSV oder SVN gewechselt.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
357
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
358 Bei GNU befindet sich folgender Copyright-Vermerk im Code:
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
359
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
360 Copyright (C) 1997-2015 Free Software Foundation, Inc.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
361 Copyright (C) 1984 David M. Ihnat
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
362
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
363 Wie aus weiteren Kommentaren zu entnehmen ist, wurde der Code von zuerst
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
364 von David MacKenzie und spaeter von Jim Meyering ueberarbeitet. Letzterer
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
365 hat den Code 1992 auch ins Versionkontrollsystem eingestellt. Weshalb
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
366 die Jahre zwischen 1992 und 1997 nicht im Copyright-Vermerk auftauchen,
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
367 ist unklar.
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
368
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
369
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
370
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
371
2
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
372 Beschreibungen
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
373
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
374 Interessant ist ein Vergleich der Kurzbeschreibungen von cut,
3
7cd149433a96 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 2
diff changeset
375 wie sie sich in der Titelzeile von Manpages oder manchmal auch
5
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
376 am Anfang der Quellcodedatei finden.
2
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
377
5
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
378 Die folgende Liste ist grob nach Zeit geordnet und nach
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
379 Abstammung gruppiert:
3
7cd149433a96 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 2
diff changeset
380
7cd149433a96 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 2
diff changeset
381
2
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
382 System III cut out selected fields of each line of a file
3
7cd149433a96 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 2
diff changeset
383 System III (src) cut and paste columns of a table (projection of a relation)
2
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
384 System V cut out selected fields of each line of a file
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
385 HP-UX cut out (extract) selected fields of each line of a file
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
386
3
7cd149433a96 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 2
diff changeset
387 4.3BSD-UWisc (src) cut and paste columns of a table (projection of a relation)
2
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
388 4.3BSD-Reno select portions of each line of a file
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
389 NetBSD select portions of each line of a file
7
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
390 OpenBSD 4.6 select portions of each line of a file
2
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
391 FreeBSD 1.0 select portions of each line of a file
3
7cd149433a96 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 2
diff changeset
392 FreeBSD 7.0 cut out selected portions of each line of a file
2
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
393 SunOS 4.1.3 remove selected fields from each line of a file
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
394 SunOS 5.5.1 cut out selected fields of each line of a file
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
395
8
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
396 Heirloom Tools cut out selected fields of each line of a file
1dc4a9dca829 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 7
diff changeset
397
2
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
398 POSIX cut out selected fields of each line of a file
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
399
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
400 GNU coreutils remove sections from each line of files
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
401
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
402 Minix select out columns of a file
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
403
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
404 Version 8 Unix rearrange columns of data
3659d2502d61 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 1
diff changeset
405 ``Unix Reader'' rearrange columns of text
1
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
406
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
407
5
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
408 Die zwei mit ``(src)'' markierten Beschreibungen sind aus
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
409 dem Quellcode entnommen, und verdeutlichen den Codetransfer.
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
410 POSIX ist ein Set von Standards, keine Implementierung. Der
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
411 ``Unix Reader'' ist ein rueckblickendes Textdokument von
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
412 Doug McIlroy, das das Auftreten von Tools in der Geschichte
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
413 des Research Unix zum Thema hat. Alle uebrigen Beschreibungen
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
414 entstammen den Manpages.
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
415
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
416 Zumeist ist mit der Zeit die POSIX-Beschreibung uebernommen
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
417 worden, wie beispielsweise bei FreeBSD zu sehen.
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
418 [ https://svnweb.freebsd.org/base?view=revision&revision=167101
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
419
7
21ca59543b07 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 6
diff changeset
420 Interessant ist, dass die GNU coreutils seit Anbeginn vom
5
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
421 Entfernen von Teilen der Eingabe sprechen, wohingegen die
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
422 Kommandozeilenangabe klar ein Auswaehlen darstellt. Die
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
423 Worte ``cut out'' sind vielleicht auch nicht klar genug.
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
424 HP-UX hat sie deshalb praezisiert.
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
425
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
426 Auch beim Begriff, was denn nun selektiert wird, ist man sich
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
427 uneins. Die einen reden von Feldern (POSIX), andere von
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
428 Abschnitten bzw. Teilen (BSD) und wieder andere von Spalten
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
429 (Research Unix). Ironischerweise leistet sich gerade Version
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
430 8 Unix, das eigentlich um eine sehr treffende Weltsicht
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
431 bemueht ist, mit ``rearrange columns of data'' die
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
432 unzutreffendste der Beschreibungen.
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
433
00097c80a853 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 4
diff changeset
434
1
a3f18ccc3996 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 0
diff changeset
435
6
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
436
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
437 Autoreninfo
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
438
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
439 Markus Schnalke interessiert sich fuer die Hintergruende
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
440 von Unix und seinen Werkzeugen. Fuer die Erarbeitung dieses
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
441 Textes wurde er regelrecht zum Historiker.
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
442
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
443
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
444 Lizenz
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
445 CC0 (und kann damit auch unter CC BY-SA 4.0 Unported
bf2ac5df0063 Zwischenstand
markus schnalke <meillo@marmaro.de>
parents: 5
diff changeset
446 veroeffentlicht werden)