hn-classics/_stories/2003/10831379.md

1168 lines
39 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
created_at: '2016-01-03T17:39:29.000Z'
title: The Art of Unix Programming (2003)
url: http://www.catb.org/esr/writings/taoup/html/
author: lookupmobile
points: 43
story_text:
comment_text:
num_comments: 10
story_id:
story_title:
story_url:
parent_id:
created_at_i: 1451842769
_tags:
- story
- author_lookupmobile
- story_10831379
objectID: '10831379'
year: 2003
---
[Source](http://www.catb.org/esr/writings/taoup/html/ "Permalink to The Art of Unix Programming")
# The Art of Unix Programming
| ----- |
| The Art of Unix Programming |
| | | [Next][1] |
* * *
# The Art of Unix Programming
### Eric Steven Raymond
[ Thyrsus Enterprises][2]
`<[esr@thyrsus.com][3]>`
Copyright 2003 Eric S. Raymond
This book and its on-line version are distributed under the terms of the Creative Commons Attribution-NoDerivs 1.0 license, with the additional proviso that the right to publish it on paper for sale or other for-profit use is reserved to Pearson Education, Inc. A reference copy of this license may be found at <http://creativecommons.org/licenses/by-nd/1.0/legalcode>.
AIX, AS/400, DB/2, OS/2, System/360, MVS, VM/CMS, and IBM PC are trademarks of IBM. Alpha, DEC, VAX, HP-UX, PDP, TOPS-10, TOPS-20, VMS, and VT-100 are trademarks of Compaq. Amiga and AmigaOS are trademarks of Amiga, Inc. Apple, Macintosh, MacOS, Newton, OpenDoc, and OpenStep are trademarks of Apple Computers, Inc. ClearCase is a trademark of Rational Software, Inc. Ethernet is a trademark of 3COM, Inc. Excel, MS-DOS, Microsoft Windows and PowerPoint are trademarks of Microsoft, Inc. Java. J2EE, JavaScript, NeWS, and Solaris are trademarks of Sun Microsystems. SPARC is a trademark of SPARC international. Informix is a trademark of Informix software. Itanium is a trademark of Intel. Linux is a trademark of Linus Torvalds. Netscape is a trademark of AOL. PDF and PostScript are trademarks of Adobe, Inc. UNIX is a trademark of The Open Group.
The photograph of Ken and Dennis in [Chapter2][4] appears courtesy of Bell Labs/Lucent Technologies.
The epigraph on the Portability chapter is from the Bell System Technical Journal, v57 #6 part 2 (July-Aug. 1978) pp. 2021-2048 and is reproduced with the permission of Bell Labs/Lucent Technologies.
| ----- |
| **Revision History** |
| Revision 1.0 | 19 September 2003 | esr |
| This is the content that went to Addison-Wesley's printers. | | |
| Revision 0.4 | 5 February 2003 | esr |
| Release for public review. | | |
| Revision 0.3 | 22 January 2003 | esr |
| First eighteen-chapter draft. Manuscript walkthrough at Chapter 12. Limited release for early reviewers. | | |
| Revision 0.2 | 2 January 2003 | esr |
| First manuscript walkthrough at Chapter 7. Released to Dmitry Kirsanov at AW production. | | |
| Revision 0.1 | 16 November 2002 | esr |
| First DocBook draft, fifteen chapters. Languages rewritten to incorporate lots of feedback. Transparency, Modularity, Multiprogramming, Configuration, Interfaces, Documentation, and Open Source chapters released. Shipped to Mark Taub at AW. | | |
| Revision 0.0 | 1999 | esr |
| Public HTML draft, first four chapters only. | | |
* * *
## Dedication
To Ken Thompson and Dennis Ritchie, because you inspired me.
**Table of Contents**
[Preface][1]
:
[Who Should Read This Book][5]
[How to Use This Book][6]
[Related References][7]
[Conventions Used in This Book][8]
[Our Case Studies][9]
[Author's Acknowledgements][10]
I. [Context][11]
:
1\. [Philosophy][12]
:
[Culture? What Culture?][13]
[The Durability of Unix][14]
[The Case against Learning Unix Culture][15]
[What Unix Gets Wrong][16]
[What Unix Gets Right][17]
:
[Open-Source Software][18]
[Cross-Platform Portability and Open Standards][19]
[The Internet and the World Wide Web][20]
[The Open-Source Community][21]
[Flexibility All the Way Down][22]
[Unix Is Fun to Hack][23]
[The Lessons of Unix Can Be Applied Elsewhere][24]
[Basics of the Unix Philosophy][25]
:
[Rule of Modularity: Write simple parts connected by clean interfaces.][26]
[Rule of Clarity: Clarity is better than cleverness.][27]
[Rule of Composition: Design programs to be connected with other programs.][28]
[Rule of Separation: Separate policy from mechanism; separate interfaces from engines.][29]
[Rule of Simplicity: Design for simplicity; add complexity only where you must.][30]
[Rule of Parsimony: Write a big program only when it is clear by demonstration that nothing else will do.][31]
[Rule of Transparency: Design for visibility to make inspection and debugging easier.][32]
[Rule of Robustness: Robustness is the child oftransparency and simplicity.][33]
[Rule of Representation: Fold knowledge into data, soprogram logic can be stupid and robust.][34]
[Rule of Least Surprise: In interface design, always do theleast surprising thing.][35]
[Rule of Silence: When a program has nothing surprising to say, it should say nothing.][36]
[Rule of Repair: Repair what you can — but when you must fail, fail noisily and as soon as possible.][37]
[Rule of Economy: Programmer time is expensive; conserve it in preference to machine time.][38]
[Rule of Generation: Avoid hand-hacking; write programs to write programs when you can.][39]
[Rule of Optimization: Prototype before polishing. Get it working before you optimize it.][40]
[Rule of Diversity: Distrust all claims for one true way.][41]
[Rule of Extensibility: Design for the future, because it will be here sooner than you think.][42]
[The Unix Philosophy in One Lesson][43]
[Applying the Unix Philosophy][44]
[Attitude Matters Too][45]
2\. [History][46]
:
[Origins and History of Unix, 1969-1995][47]
:
[Genesis: 19691971][48]
[Exodus: 19711980][49]
[TCP/IP and the Unix Wars: 1980-1990][50]
[Blows against the Empire: 1991-1995][51]
[Origins and History of the Hackers, 1961-1995][52]
:
[At Play in the Groves of Academe: 1961-1980][53]
[Internet Fusion and the Free Software Movement: 1981-1991][54]
[Linux and the Pragmatist Reaction: 1991-1998][55]
[The Open-Source Movement: 1998 and Onward][56]
[The Lessons of Unix History][57]
3\. [Contrasts][58]
:
[The Elements of Operating-System Style][59]
:
[What Is the Operating System's Unifying Idea?][60]
[Multitasking Capability][61]
[Cooperating Processes][62]
[Internal Boundaries][63]
[File Attributes and Record Structures][64]
[Binary File Formats][65]
[Preferred User Interface Style][66]
[Intended Audience][67]
[Entry Barriers to Development][68]
[Operating-System Comparisons][69]
:
[VMS][70]
[MacOS][71]
[OS/2][72]
[Windows NT][73]
[BeOS][74]
[MVS][75]
[VM/CMS][76]
[Linux][77]
[What Goes Around, Comes Around][78]
II. [Design][79]
:
4\. [Modularity][80]
:
[Encapsulation and Optimal Module Size][81]
[Compactness and Orthogonality][82]
:
[Compactness][83]
[Orthogonality][84]
[The SPOT Rule][85]
[Compactness and the Strong Single Center][86]
[The Value of Detachment][87]
[Software Is a Many-Layered Thing][88]
:
[Top-Down versus Bottom-Up][89]
[Glue Layers][90]
[Case Study: C Considered as Thin Glue][91]
[Libraries][92]
:
[Case Study: GIMP Plugins][93]
[Unix and Object-Oriented Languages][94]
[Coding for Modularity][95]
5\. [Textuality][96]
:
[The Importance of Being Textual][97]
:
[Case Study: Unix Password File Format][98]
[Case Study: .newsrc Format][99]
[Case Study: The PNG Graphics File Format][100]
[Data File Metaformats][101]
:
[DSV Style][102]
[RFC 822 Format][103]
[Cookie-Jar Format][104]
[Record-Jar Format][105]
[XML][106]
[Windows INI Format][107]
[Unix Textual File Format Conventions][108]
[The Pros and Cons of File Compression][109]
[Application Protocol Design][110]
:
[Case Study: SMTP, the Simple Mail Transfer Protocol][111]
[Case Study: POP3, the Post Office Protocol][112]
[Case Study: IMAP, the Internet Message Access Protocol][113]
[Application Protocol Metaformats][114]
:
[The Classical Internet Application Metaprotocol][115]
[HTTP as a Universal Application Protocol][116]
[BEEP: Blocks Extensible Exchange Protocol][117]
[XML-RPC, SOAP, and Jabber][118]
6\. [Transparency][119]
:
[Studying Cases][120]
:
[Case Study: audacity][121]
[Case Study: fetchmail's -v option][122]
[Case Study: GCC][123]
[Case Study: kmail][124]
[Case Study: SNG][125]
[Case Study: The Terminfo Database][126]
[Case Study: Freeciv Data Files][127]
[Designing for Transparency and Discoverability][128]
:
[The Zen of Transparency][129]
[Coding for Transparency and Discoverability][130]
[Transparency and Avoiding Overprotectiveness][131]
[Transparency and Editable Representations][132]
[Transparency, Fault Diagnosis, and Fault Recovery][133]
[Designing for Maintainability][134]
7\. [Multiprogramming][135]
:
[Separating Complexity Control from Performance Tuning][136]
[Taxonomy of Unix IPC Methods][137]
:
[Handing off Tasks to Specialist Programs][138]
[Pipes, Redirection, and Filters][139]
[Wrappers][140]
[Security Wrappers and Bernstein Chaining][141]
[Slave Processes][142]
[Peer-to-Peer Inter-Process Communication][143]
[Problems and Methods to Avoid][144]
:
[Obsolescent Unix IPC Methods][145]
[Remote Procedure Calls][146]
[Threads — Threat or Menace?][147]
[Process Partitioning at the Design Level][148]
8\. [Minilanguages][149]
:
[Understanding the Taxonomy of Languages][150]
[Applying Minilanguages][151]
:
[Case Study: sng][152]
[Case Study: Regular Expressions][153]
[Case Study: Glade][154]
[Case Study: m4][155]
[Case Study: XSLT][156]
[Case Study: The Documenter's Workbench Tools][157]
[Case Study: fetchmail Run-Control Syntax][158]
[Case Study: awk][159]
[Case Study: PostScript][160]
[Case Study: bc and dc][161]
[Case Study: Emacs Lisp][162]
[Case Study: JavaScript][163]
[Designing Minilanguages][164]
:
[Choosing the Right Complexity Level][165]
[Extending and Embedding Languages][166]
[Writing a Custom Grammar][167]
[Macros — Beware!][168]
[Language or Application Protocol?][169]
9\. [Generation][170]
:
[Data-Driven Programming][171]
:
[Case Study: ascii][172]
[Case Study: Statistical Spam Filtering][173]
[Case Study: Metaclass Hacking in fetchmailconf][174]
[Ad-hoc Code Generation][175]
:
[Case Study: Generating Code for the ascii Displays][176]
[Case Study: Generating HTML Code for a Tabular List][177]
10\. [Configuration][178]
:
[What Should Be Configurable?][179]
[Where Configurations Live][180]
[Run-Control Files][181]
:
[Case Study: The .netrc File][182]
[Portability to Other Operating Systems][183]
[Environment Variables][184]
:
[System Environment Variables][185]
[User Environment Variables][186]
[When to Use Environment Variables][187]
[Portability to Other Operating Systems][188]
[Command-Line Options][189]
:
[The -a to -z of Command-Line Options][190]
[Portability to Other Operating Systems][191]
[How to Choose among the Methods][192]
:
[Case Study: fetchmail][193]
[Case Study: The XFree86 Server][194]
[On Breaking These Rules][195]
11\. [Interfaces][196]
:
[Applying the Rule of Least Surprise][197]
[History of Interface Design on Unix][198]
[Evaluating Interface Designs][199]
[Tradeoffs between CLI and Visual Interfaces][200]
:
[Case Study: Two Ways to Write a Calculator Program][201]
[Transparency, Expressiveness, and Configurability][202]
[Unix Interface Design Patterns][203]
:
[The Filter Pattern][204]
[The Cantrip Pattern][205]
[The Source Pattern][206]
[The Sink Pattern][207]
[The Compiler Pattern][208]
[The ed pattern][209]
[The Roguelike Pattern][210]
[The Separated Engine and Interface Pattern][211]
[The CLI Server Pattern][212]
[Language-Based Interface Patterns][213]
[Applying Unix Interface-Design Patterns][214]
:
[The Polyvalent-Program Pattern][215]
[The Web Browser as a Universal Front End][216]
[Silence Is Golden][217]
12\. [Optimization][218]
:
[Don't Just Do Something, Stand There!][219]
[Measure before Optimizing][220]
[Nonlocality Considered Harmful][221]
[Throughput vs. Latency][222]
:
[Batching Operations][223]
[Overlapping Operations][224]
[Caching Operation Results][225]
13\. [Complexity][226]
:
[Speaking of Complexity][227]
:
[The Three Sources of Complexity][228]
[Tradeoffs between Interface and Implementation Complexity][229]
[Essential, Optional, and Accidental Complexity][230]
[Mapping Complexity][231]
[When Simplicity Is Not Enough][232]
[A Tale of Five Editors][233]
:
[ed][234]
[vi][235]
[Sam][236]
[Emacs][237]
[Wily][238]
[The Right Size for an Editor][239]
:
[Identifying the Complexity Problems][240]
[Compromise Doesn't Work][241]
[Is Emacs an Argument against the Unix Tradition?][242]
[The Right Size of Software][243]
III. [Implementation][244]
:
14\. [Languages][245]
:
[Unix's Cornucopia of Languages][246]
[Why Not C?][247]
[Interpreted Languages and Mixed Strategies][248]
[Language Evaluations][249]
:
[C][250]
[C++][251]
[Shell][252]
[Perl][253]
[Tcl][254]
[Python][255]
[Java][256]
[Emacs Lisp][257]
[Trends for the Future][258]
[Choosing an X Toolkit][259]
15\. [Tools][260]
:
[A Developer-Friendly Operating System][261]
[Choosing an Editor][262]
:
[Useful Things to Know about vi][263]
[Useful Things to Know about Emacs][264]
[The Antireligious Choice: Using Both][265]
[Special-Purpose Code Generators][266]
:
[yacc and lex][267]
[Case Study: Glade][268]
[make: Automating Your Recipes][269]
:
[Basic Theory of make][270]
[make in Non-C/C++ Development][271]
[Utility Productions][272]
[Generating Makefiles][273]
[Version-Control Systems][274]
:
[Why Version Control?][275]
[Version Control by Hand][276]
[Automated Version Control][277]
[Unix Tools for Version Control][278]
[Runtime Debugging][279]
[Profiling][280]
[Combining Tools with Emacs][281]
:
[Emacs and make][282]
[Emacs and Runtime Debugging][283]
[Emacs and Version Control][284]
[Emacs and Profiling][285]
[Like an IDE, Only Better][286]
16\. [Reuse][287]
:
[The Tale of J. Random Newbie][288]
[Transparency as the Key to Reuse][289]
[From Reuse to Open Source][290]
[The Best Things in Life Are Open][291]
[Where to Look?][292]
[Issues in Using Open-Source Software][293]
[Licensing Issues][294]
:
[What Qualifies as Open Source][295]
[Standard Open-Source Licenses][296]
[When You Need a Lawyer][297]
IV. [Community][298]
:
17\. [Portability][299]
:
[Evolution of C][300]
:
[Early History of C][301]
[C Standards][302]
[Unix Standards][303]
:
[Standards and the Unix Wars][304]
[The Ghost at the Victory Banquet][305]
[Unix Standards in the Open-Source World][306]
[IETF and the RFC Standards Process][307]
[Specifications as DNA, Code as RNA][308]
[Programming for Portability][309]
:
[Portability and Choice of Language][310]
[Avoiding System Dependencies][311]
[Tools for Portability][312]
[Internationalization][313]
[Portability, Open Standards, and Open Source][314]
18\. [Documentation][315]
:
[Documentation Concepts][316]
[The Unix Style][317]
:
[The Large-Document Bias][318]
[Cultural Style][319]
[The Zoo of Unix Documentation Formats][320]
:
[troff and the Documenter's Workbench Tools][321]
[TeX][322]
[Texinfo][323]
[POD][324]
[HTML][325]
[DocBook][326]
[The Present Chaos and a Possible Way Out][327]
[DocBook][328]
:
[Document Type Definitions][329]
[Other DTDs][330]
[The DocBook Toolchain][331]
[Migration Tools][332]
[Editing Tools][333]
[Related Standards and Practices][334]
[SGML][335]
[XML-DocBook References][336]
[Best Practices for Writing Unix Documentation][337]
19\. [Open Source][338]
:
[Unix and Open Source][339]
[Best Practices for Working with Open-Source Developers][340]
:
[Good Patching Practice][341]
[Good Project- and Archive-Naming Practice][342]
[Good Development Practice][343]
[Good Distribution-Making Practice][344]
[Good Communication Practice][345]
[The Logic of Licenses: How to Pick One][346]
[Why You Should Use a Standard License][347]
[Varieties of Open-Source Licensing][348]
:
[MIT or X Consortium License][349]
[BSD Classic License][350]
[Artistic License][351]
[General Public License][352]
[Mozilla Public License][353]
20\. [Futures][354]
:
[Essence and Accident in Unix Tradition][355]
[Plan 9: The Way the Future Was][356]
[Problems in the Design of Unix][357]
:
[A Unix File Is Just a Big Bag of Bytes][358]
[Unix Support for GUIs Is Weak][359]
[File Deletion Is Forever][360]
[Unix Assumes a Static File System][361]
[The Design of Job Control Was Badly Botched][362]
[The Unix API Doesn't Use Exceptions][363]
[ioctl2 and fcntl2 Are an Embarrassment][364]
[The Unix Security Model May Be Too Primitive][365]
[Unix Has Too Many Different Kinds of Names][366]
[File Systems Might Be Considered Harmful][367]
[Towards a Global Internet Address Space][368]
[Problems in the Environment of Unix][369]
[Problems in the Culture of Unix][370]
[Reasons to Believe][371]
A. [Glossary of Abbreviations][372]
B. [References][373]
C. [Contributors][374]
D. [Rootless Root][375]
:
[Editor's Introduction][376]
[Master Foo and the Ten Thousand Lines][377]
[Master Foo and the Script Kiddie][378]
[Master Foo Discourses on the Two Paths][379]
[Master Foo and the Methodologist][380]
[Master Foo Discourses on the Graphical User Interface][381]
[Master Foo and the Unix Zealot][382]
[Master Foo Discourses on the Unix-Nature][383]
[Master Foo and the End User][384]
**List of Figures**
2.1. [The PDP-7.][385]
3.1. [Schematic history of timesharing.][386]
4.1. [Qualitative plot of defect count and density vs. module size.][387]
4.2. [Caller/callee relationships in GIMP with a plugin loaded.][388]
6.1. [Screen shot of audacity.][389]
6.2. [Screen shot of kmail.][390]
6.3. [Main window of a Freeciv game.][391]
8.1. [Taxonomy of languages.][392]
11.1. [The xcalc GUI.][393]
11.2. [Screen shot of the original Rogue game.][394]
11.3. [The Xcdroast GUI.][395]
11.4. [Caller/callee relationships in a polyvalent program.][396]
13.1. [Sources and kinds of complexity.][397]
18.1. [Processing structural documents.][398]
18.2. [Present-day XML-DocBook toolchain.][399]
18.3. [Future XML-DocBook toolchain with FOP.][400]
**List of Tables**
8.1. [Regular-expression examples.][401]
8.2. [Introduction to regular-expression operations.][402]
14.1. [Language choices.][403]
14.2. [Summary of X Toolkits.][404]
**List of Examples**
5.1. [Password file example.][405]
5.2. [A .newsrc example.][406]
5.3. [A fortune file example.][407]
5.4. [Basic data for three planets in a record-jar format.][408]
5.5. [An XML example.][409]
5.6. [A .INI file example.][410]
5.7. [An SMTP session example.][411]
5.8. [A POP3 example session.][412]
5.9. [An IMAP session example.][413]
6.1. [An example fetchmail -v transcript.][414]
6.2. [An SNG Example.][415]
7.1. [The pic2graph pipeline.][416]
8.1. [Glade Hello, World.][417]
8.2. [A sample m4 macro.][418]
8.3. [A sample XSLT program.][419]
8.4. [Taxonomy of languages — the pic source.][420]
8.5. [Synthetic example of a fetchmailrc.][421]
8.6. [RSA implementation using dc.][422]
9.1. [Example of fetchmailrc syntax.][423]
9.2. [Python structure dump of a fetchmail configuration.][424]
9.3. [copy_instance metaclass code.][425]
9.4. [Calling context for copy_instance.][426]
9.5. [ascii usage screen.][427]
9.6. [Desired output format for the star table.][428]
9.7. [Master form of the star table.][429]
10.1. [A .netrc example.][430]
10.2. [X configuration example.][431]
18.1. [groff1 markup example.][432]
18.2. [man markup example.][433]
19.1. [tar archive maker production.][434]
* * *
| ----- |
| | | [Next][1] |
| | | Preface |
[1]: http://www.catb.org/preface.html
[2]: http://www.catb.org/~esr/
[3]: mailto:esr%40thyrsus.com
[4]: http://www.catb.org/historychapter.html "Chapter2.History"
[5]: http://www.catb.org/pr01s01.html
[6]: http://www.catb.org/pr01s02.html
[7]: http://www.catb.org/pr01s03.html
[8]: http://www.catb.org/pr01s04.html
[9]: http://www.catb.org/pr01s05.html
[10]: http://www.catb.org/pr01s06.html
[11]: http://www.catb.org/context.html
[12]: http://www.catb.org/philosophychapter.html
[13]: http://www.catb.org/ch01s01.html
[14]: http://www.catb.org/ch01s02.html
[15]: http://www.catb.org/ch01s03.html
[16]: http://www.catb.org/ch01s04.html
[17]: http://www.catb.org/ch01s05.html
[18]: http://www.catb.org/ch01s05.html#id2808846
[19]: http://www.catb.org/ch01s05.html#id2872776
[20]: http://www.catb.org/ch01s05.html#id2872827
[21]: http://www.catb.org/ch01s05.html#id2872945
[22]: http://www.catb.org/ch01s05.html#id2873031
[23]: http://www.catb.org/ch01s05.html#id2873078
[24]: http://www.catb.org/ch01s05.html#id2873180
[25]: http://www.catb.org/ch01s06.html
[26]: http://www.catb.org/ch01s06.html#id2877537
[27]: http://www.catb.org/ch01s06.html#id2877610
[28]: http://www.catb.org/ch01s06.html#id2877684
[29]: http://www.catb.org/ch01s06.html#id2877777
[30]: http://www.catb.org/ch01s06.html#id2877917
[31]: http://www.catb.org/ch01s06.html#id2878022
[32]: http://www.catb.org/ch01s06.html#id2878054
[33]: http://www.catb.org/ch01s06.html#id2878145
[34]: http://www.catb.org/ch01s06.html#id2878263
[35]: http://www.catb.org/ch01s06.html#id2878339
[36]: http://www.catb.org/ch01s06.html#id2878450
[37]: http://www.catb.org/ch01s06.html#id2878538
[38]: http://www.catb.org/ch01s06.html#id2878666
[39]: http://www.catb.org/ch01s06.html#id2878742
[40]: http://www.catb.org/ch01s06.html#rule_of_optimization
[41]: http://www.catb.org/ch01s06.html#id2879078
[42]: http://www.catb.org/ch01s06.html#id2879112
[43]: http://www.catb.org/ch01s07.html
[44]: http://www.catb.org/ch01s08.html
[45]: http://www.catb.org/ch01s09.html
[46]: http://www.catb.org/historychapter.html
[47]: http://www.catb.org/ch02s01.html
[48]: http://www.catb.org/ch02s01.html#genesis
[49]: http://www.catb.org/ch02s01.html#id2879627
[50]: http://www.catb.org/ch02s01.html#id2880014
[51]: http://www.catb.org/ch02s01.html#id2886020
[52]: http://www.catb.org/hackers.html
[53]: http://www.catb.org/hackers.html#id2886621
[54]: http://www.catb.org/hackers.html#id2886828
[55]: http://www.catb.org/hackers.html#linux_reaction
[56]: http://www.catb.org/ch02s03.html
[57]: http://www.catb.org/ch02s04.html
[58]: http://www.catb.org/contrastchapter.html
[59]: http://www.catb.org/ch03s01.html
[60]: http://www.catb.org/ch03s01.html#id2892028
[61]: http://www.catb.org/ch03s01.html#id2892085
[62]: http://www.catb.org/ch03s01.html#id2892171
[63]: http://www.catb.org/ch03s01.html#id2888136
[64]: http://www.catb.org/ch03s01.html#id2888217
[65]: http://www.catb.org/ch03s01.html#id2888298
[66]: http://www.catb.org/ch03s01.html#id2888363
[67]: http://www.catb.org/ch03s01.html#id2888484
[68]: http://www.catb.org/ch03s01.html#id2888581
[69]: http://www.catb.org/ch03s02.html
[70]: http://www.catb.org/ch03s02.html#vms
[71]: http://www.catb.org/ch03s02.html#mac_os_contrast
[72]: http://www.catb.org/ch03s02.html#os_2
[73]: http://www.catb.org/ch03s02.html#nt_contrast
[74]: http://www.catb.org/ch03s02.html#beos
[75]: http://www.catb.org/ch03s02.html#mvs
[76]: http://www.catb.org/ch03s02.html#id2893777
[77]: http://www.catb.org/ch03s02.html#linux
[78]: http://www.catb.org/ch03s03.html
[79]: http://www.catb.org/design.html
[80]: http://www.catb.org/modularitychapter.html
[81]: http://www.catb.org/ch04s01.html
[82]: http://www.catb.org/ch04s02.html
[83]: http://www.catb.org/ch04s02.html#compactness
[84]: http://www.catb.org/ch04s02.html#orthogonality
[85]: http://www.catb.org/ch04s02.html#spot_rule
[86]: http://www.catb.org/ch04s02.html#id2895445
[87]: http://www.catb.org/ch04s02.html#id2899405
[88]: http://www.catb.org/ch04s03.html
[89]: http://www.catb.org/ch04s03.html#id2899552
[90]: http://www.catb.org/ch04s03.html#id2899777
[91]: http://www.catb.org/ch04s03.html#c_thin_glue
[92]: http://www.catb.org/ch04s04.html
[93]: http://www.catb.org/ch04s04.html#gimp_plugins
[94]: http://www.catb.org/unix_and_oo.html
[95]: http://www.catb.org/ch04s06.html
[96]: http://www.catb.org/textualitychapter.html
[97]: http://www.catb.org/ch05s01.html
[98]: http://www.catb.org/ch05s01.html#id2901332
[99]: http://www.catb.org/ch05s01.html#id2901494
[100]: http://www.catb.org/ch05s01.html#png
[101]: http://www.catb.org/ch05s02.html
[102]: http://www.catb.org/ch05s02.html#id2901882
[103]: http://www.catb.org/ch05s02.html#id2902039
[104]: http://www.catb.org/ch05s02.html#id2902164
[105]: http://www.catb.org/ch05s02.html#id2906931
[106]: http://www.catb.org/ch05s02.html#id2907018
[107]: http://www.catb.org/ch05s02.html#id2907263
[108]: http://www.catb.org/ch05s02.html#id2907428
[109]: http://www.catb.org/ch05s02.html#id2907903
[110]: http://www.catb.org/ch05s03.html
[111]: http://www.catb.org/ch05s03.html#id2908194
[112]: http://www.catb.org/ch05s03.html#id2908383
[113]: http://www.catb.org/ch05s03.html#id2908582
[114]: http://www.catb.org/ch05s04.html
[115]: http://www.catb.org/ch05s04.html#id2908835
[116]: http://www.catb.org/ch05s04.html#id2908915
[117]: http://www.catb.org/ch05s04.html#id2909217
[118]: http://www.catb.org/ch05s04.html#id2909294
[119]: http://www.catb.org/transparencychapter.html
[120]: http://www.catb.org/ch06s01.html
[121]: http://www.catb.org/ch06s01.html#audacity
[122]: http://www.catb.org/ch06s01.html#fetchmail_v
[123]: http://www.catb.org/ch06s01.html#id2909841
[124]: http://www.catb.org/ch06s01.html#id2909954
[125]: http://www.catb.org/ch06s01.html#id2910193
[126]: http://www.catb.org/ch06s01.html#id2910334
[127]: http://www.catb.org/ch06s01.html#id2914115
[128]: http://www.catb.org/ch06s02.html
[129]: http://www.catb.org/ch06s02.html#zen_of_transparency
[130]: http://www.catb.org/ch06s02.html#id2914509
[131]: http://www.catb.org/ch06s02.html#id2914680
[132]: http://www.catb.org/ch06s02.html#id2914758
[133]: http://www.catb.org/ch06s02.html#id2915107
[134]: http://www.catb.org/ch06s03.html
[135]: http://www.catb.org/multiprogramchapter.html
[136]: http://www.catb.org/ch07s01.html
[137]: http://www.catb.org/ch07s02.html
[138]: http://www.catb.org/ch07s02.html#id2915475
[139]: http://www.catb.org/ch07s02.html#plumbing
[140]: http://www.catb.org/ch07s02.html#id2921506
[141]: http://www.catb.org/ch07s02.html#id2921634
[142]: http://www.catb.org/ch07s02.html#id2922002
[143]: http://www.catb.org/ch07s02.html#id2922148
[144]: http://www.catb.org/ch07s03.html
[145]: http://www.catb.org/ch07s03.html#id2923376
[146]: http://www.catb.org/ch07s03.html#id2923675
[147]: http://www.catb.org/ch07s03.html#id2923889
[148]: http://www.catb.org/ch07s04.html
[149]: http://www.catb.org/minilanguageschapter.html
[150]: http://www.catb.org/ch08s01.html
[151]: http://www.catb.org/ch08s02.html
[152]: http://www.catb.org/ch08s02.html#id2924747
[153]: http://www.catb.org/ch08s02.html#regexps
[154]: http://www.catb.org/ch08s02.html#id2933450
[155]: http://www.catb.org/ch08s02.html#id2933775
[156]: http://www.catb.org/ch08s02.html#id2934034
[157]: http://www.catb.org/ch08s02.html#id2934197
[158]: http://www.catb.org/ch08s02.html#fetchmailrc
[159]: http://www.catb.org/ch08s02.html#awk
[160]: http://www.catb.org/ch08s02.html#id2935613
[161]: http://www.catb.org/ch08s02.html#id2935779
[162]: http://www.catb.org/ch08s02.html#emacs_lisp_study
[163]: http://www.catb.org/ch08s02.html#javascript
[164]: http://www.catb.org/ch08s03.html
[165]: http://www.catb.org/ch08s03.html#id2936413
[166]: http://www.catb.org/ch08s03.html#id2936650
[167]: http://www.catb.org/ch08s03.html#id2936912
[168]: http://www.catb.org/ch08s03.html#macroexpansion
[169]: http://www.catb.org/ch08s03.html#id2937424
[170]: http://www.catb.org/generationchapter.html
[171]: http://www.catb.org/ch09s01.html
[172]: http://www.catb.org/ch09s01.html#id2939746
[173]: http://www.catb.org/ch09s01.html#bayes_spam
[174]: http://www.catb.org/ch09s01.html#fetchmailconf
[175]: http://www.catb.org/ch09s02.html
[176]: http://www.catb.org/ch09s02.html#id2938615
[177]: http://www.catb.org/ch09s02.html#htmlgen
[178]: http://www.catb.org/configurationchapter.html
[179]: http://www.catb.org/ch10s01.html
[180]: http://www.catb.org/ch10s02.html
[181]: http://www.catb.org/ch10s03.html
[182]: http://www.catb.org/ch10s03.html#id2942210
[183]: http://www.catb.org/ch10s03.html#id2942358
[184]: http://www.catb.org/ch10s04.html
[185]: http://www.catb.org/ch10s04.html#id2942463
[186]: http://www.catb.org/ch10s04.html#id2942749
[187]: http://www.catb.org/ch10s04.html#id2942882
[188]: http://www.catb.org/ch10s04.html#id2947980
[189]: http://www.catb.org/ch10s05.html
[190]: http://www.catb.org/ch10s05.html#id2948149
[191]: http://www.catb.org/ch10s05.html#id2950162
[192]: http://www.catb.org/ch10s06.html
[193]: http://www.catb.org/ch10s06.html#fetchmail_environment
[194]: http://www.catb.org/ch10s06.html#id2950578
[195]: http://www.catb.org/ch10s07.html
[196]: http://www.catb.org/interfacechapter.html
[197]: http://www.catb.org/ch11s01.html
[198]: http://www.catb.org/ch11s02.html
[199]: http://www.catb.org/ch11s03.html
[200]: http://www.catb.org/ch11s04.html
[201]: http://www.catb.org/ch11s04.html#id2951734
[202]: http://www.catb.org/ch11s05.html
[203]: http://www.catb.org/ch11s06.html
[204]: http://www.catb.org/ch11s06.html#id2957637
[205]: http://www.catb.org/ch11s06.html#id2957916
[206]: http://www.catb.org/ch11s06.html#id2958032
[207]: http://www.catb.org/ch11s06.html#id2958116
[208]: http://www.catb.org/ch11s06.html#id2958199
[209]: http://www.catb.org/ch11s06.html#id2958336
[210]: http://www.catb.org/ch11s06.html#id2958491
[211]: http://www.catb.org/ch11s06.html#id2958899
[212]: http://www.catb.org/ch11s06.html#id2959821
[213]: http://www.catb.org/ch11s06.html#id2959928
[214]: http://www.catb.org/ch11s07.html
[215]: http://www.catb.org/ch11s07.html#id2960228
[216]: http://www.catb.org/ch11s08.html
[217]: http://www.catb.org/ch11s09.html
[218]: http://www.catb.org/optimizationchapter.html
[219]: http://www.catb.org/ch12s01.html
[220]: http://www.catb.org/ch12s02.html
[221]: http://www.catb.org/ch12s03.html
[222]: http://www.catb.org/ch12s04.html
[223]: http://www.catb.org/ch12s04.html#id2961306
[224]: http://www.catb.org/ch12s04.html#id2961372
[225]: http://www.catb.org/ch12s04.html#binary_caches
[226]: http://www.catb.org/complexitychapter.html
[227]: http://www.catb.org/ch13s01.html
[228]: http://www.catb.org/ch13s01.html#id2964646
[229]: http://www.catb.org/ch13s01.html#id2964843
[230]: http://www.catb.org/ch13s01.html#id2961759
[231]: http://www.catb.org/ch13s01.html#id2961870
[232]: http://www.catb.org/ch13s01.html#id2963237
[233]: http://www.catb.org/ch13s02.html
[234]: http://www.catb.org/ch13s02.html#id2963445
[235]: http://www.catb.org/ch13s02.html#vi_complexity
[236]: http://www.catb.org/ch13s02.html#id2963798
[237]: http://www.catb.org/ch13s02.html#emacs_editing
[238]: http://www.catb.org/ch13s02.html#id2967110
[239]: http://www.catb.org/ch13s03.html
[240]: http://www.catb.org/ch13s03.html#id2967267
[241]: http://www.catb.org/ch13s03.html#id2967642
[242]: http://www.catb.org/ch13s03.html#id2967765
[243]: http://www.catb.org/ch13s04.html
[244]: http://www.catb.org/implementation.html
[245]: http://www.catb.org/languageschapter.html
[246]: http://www.catb.org/ch14s01.html
[247]: http://www.catb.org/why_not_c.html
[248]: http://www.catb.org/ch14s03.html
[249]: http://www.catb.org/ch14s04.html
[250]: http://www.catb.org/ch14s04.html#c_language
[251]: http://www.catb.org/ch14s04.html#cc_language
[252]: http://www.catb.org/ch14s04.html#sh
[253]: http://www.catb.org/ch14s04.html#perl
[254]: http://www.catb.org/ch14s04.html#tcl
[255]: http://www.catb.org/ch14s04.html#python_language
[256]: http://www.catb.org/ch14s04.html#java
[257]: http://www.catb.org/ch14s04.html#emacs_lisp_language
[258]: http://www.catb.org/ch14s05.html
[259]: http://www.catb.org/ch14s06.html
[260]: http://www.catb.org/toolschapter.html
[261]: http://www.catb.org/ch15s01.html
[262]: http://www.catb.org/ch15s02.html
[263]: http://www.catb.org/ch15s02.html#vi_literacy
[264]: http://www.catb.org/ch15s02.html#id2979540
[265]: http://www.catb.org/ch15s02.html#id2979678
[266]: http://www.catb.org/ch15s03.html
[267]: http://www.catb.org/ch15s03.html#id2979797
[268]: http://www.catb.org/ch15s03.html#id2986324
[269]: http://www.catb.org/ch15s04.html
[270]: http://www.catb.org/ch15s04.html#id2986550
[271]: http://www.catb.org/ch15s04.html#id2986902
[272]: http://www.catb.org/ch15s04.html#id2987148
[273]: http://www.catb.org/ch15s04.html#id2987644
[274]: http://www.catb.org/ch15s05.html
[275]: http://www.catb.org/ch15s05.html#id2988357
[276]: http://www.catb.org/ch15s05.html#id2988464
[277]: http://www.catb.org/ch15s05.html#id2988503
[278]: http://www.catb.org/ch15s05.html#id2988625
[279]: http://www.catb.org/ch15s06.html
[280]: http://www.catb.org/ch15s07.html
[281]: http://www.catb.org/ch15s08.html
[282]: http://www.catb.org/ch15s08.html#id2989559
[283]: http://www.catb.org/ch15s08.html#id2989677
[284]: http://www.catb.org/ch15s08.html#id2989781
[285]: http://www.catb.org/ch15s08.html#id2989869
[286]: http://www.catb.org/ch15s08.html#id2989926
[287]: http://www.catb.org/reusechapter.html
[288]: http://www.catb.org/ch16s01.html
[289]: http://www.catb.org/ch16s02.html
[290]: http://www.catb.org/ch16s03.html
[291]: http://www.catb.org/ch16s04.html
[292]: http://www.catb.org/ch16s05.html
[293]: http://www.catb.org/ch16s06.html
[294]: http://www.catb.org/ch16s07.html
[295]: http://www.catb.org/ch16s07.html#id2991059
[296]: http://www.catb.org/ch16s07.html#id2993547
[297]: http://www.catb.org/ch16s07.html#id2993874
[298]: http://www.catb.org/community.html
[299]: http://www.catb.org/portabilitychapter.html
[300]: http://www.catb.org/c_evolution.html
[301]: http://www.catb.org/c_evolution.html#id2998213
[302]: http://www.catb.org/c_evolution.html#id2994334
[303]: http://www.catb.org/ch17s02.html
[304]: http://www.catb.org/ch17s02.html#id2994594
[305]: http://www.catb.org/ch17s02.html#id2999310
[306]: http://www.catb.org/ch17s02.html#id2999366
[307]: http://www.catb.org/ietf_process.html
[308]: http://www.catb.org/ch17s04.html
[309]: http://www.catb.org/ch17s05.html
[310]: http://www.catb.org/ch17s05.html#id3000303
[311]: http://www.catb.org/ch17s05.html#id3000882
[312]: http://www.catb.org/ch17s05.html#id3000984
[313]: http://www.catb.org/ch17s06.html
[314]: http://www.catb.org/ch17s07.html
[315]: http://www.catb.org/documentationchapter.html
[316]: http://www.catb.org/ch18s01.html
[317]: http://www.catb.org/ch18s02.html
[318]: http://www.catb.org/ch18s02.html#id3001392
[319]: http://www.catb.org/ch18s02.html#id3001522
[320]: http://www.catb.org/ch18s03.html
[321]: http://www.catb.org/ch18s03.html#id3001604
[322]: http://www.catb.org/ch18s03.html#id3001898
[323]: http://www.catb.org/ch18s03.html#id3002206
[324]: http://www.catb.org/ch18s03.html#id3002268
[325]: http://www.catb.org/ch18s03.html#id3002291
[326]: http://www.catb.org/ch18s03.html#id3002310
[327]: http://www.catb.org/ch18s04.html
[328]: http://www.catb.org/ch18s05.html
[329]: http://www.catb.org/ch18s05.html#id3006015
[330]: http://www.catb.org/ch18s05.html#id3006182
[331]: http://www.catb.org/ch18s05.html#db_toolchain
[332]: http://www.catb.org/ch18s05.html#id3006742
[333]: http://www.catb.org/ch18s05.html#id3007022
[334]: http://www.catb.org/ch18s05.html#id3007143
[335]: http://www.catb.org/ch18s05.html#id3007192
[336]: http://www.catb.org/ch18s05.html#id3007297
[337]: http://www.catb.org/ch18s06.html
[338]: http://www.catb.org/opensourcechapter.html
[339]: http://www.catb.org/ch19s01.html
[340]: http://www.catb.org/ch19s02.html
[341]: http://www.catb.org/ch19s02.html#patching
[342]: http://www.catb.org/ch19s02.html#naming
[343]: http://www.catb.org/ch19s02.html#develpractice
[344]: http://www.catb.org/ch19s02.html#distpractice
[345]: http://www.catb.org/ch19s02.html#communication
[346]: http://www.catb.org/ch19s03.html
[347]: http://www.catb.org/ch19s04.html
[348]: http://www.catb.org/ch19s05.html
[349]: http://www.catb.org/ch19s05.html#id3014860
[350]: http://www.catb.org/ch19s05.html#id3014890
[351]: http://www.catb.org/ch19s05.html#id3014963
[352]: http://www.catb.org/ch19s05.html#id3015011
[353]: http://www.catb.org/ch19s05.html#id3015063
[354]: http://www.catb.org/futurechapter.html
[355]: http://www.catb.org/ch20s01.html
[356]: http://www.catb.org/plan9.html
[357]: http://www.catb.org/ch20s03.html
[358]: http://www.catb.org/ch20s03.html#id3015538
[359]: http://www.catb.org/ch20s03.html#id3015724
[360]: http://www.catb.org/ch20s03.html#id3015838
[361]: http://www.catb.org/ch20s03.html#id3015895
[362]: http://www.catb.org/ch20s03.html#id3015943
[363]: http://www.catb.org/ch20s03.html#id3016077
[364]: http://www.catb.org/ch20s03.html#id3016155
[365]: http://www.catb.org/ch20s03.html#id3019078
[366]: http://www.catb.org/ch20s03.html#id3019113
[367]: http://www.catb.org/ch20s03.html#id3019140
[368]: http://www.catb.org/ch20s03.html#id3019193
[369]: http://www.catb.org/ch20s04.html
[370]: http://www.catb.org/ch20s05.html
[371]: http://www.catb.org/ch20s06.html
[372]: http://www.catb.org/apa.html
[373]: http://www.catb.org/apb.html
[374]: http://www.catb.org/apc.html
[375]: http://www.catb.org/unix_koans.html
[376]: http://www.catb.org/introduction.html
[377]: http://www.catb.org/ten-thousand.html
[378]: http://www.catb.org/script-kiddie.html
[379]: http://www.catb.org/two_paths.html
[380]: http://www.catb.org/methodology-consultant.html
[381]: http://www.catb.org/gui-programmer.html
[382]: http://www.catb.org/zealot.html
[383]: http://www.catb.org/unix-nature.html
[384]: http://www.catb.org/end-user.html
[385]: http://www.catb.org/ch02s01.html#pdp7
[386]: http://www.catb.org/ch03s02.html#os-history
[387]: http://www.catb.org/ch04s01.html#hatton
[388]: http://www.catb.org/ch04s04.html#libgimp
[389]: http://www.catb.org/ch06s01.html#id2909476
[390]: http://www.catb.org/ch06s01.html#id2910036
[391]: http://www.catb.org/ch06s01.html#id2914147
[392]: http://www.catb.org/ch08s01.html#taxonomy
[393]: http://www.catb.org/ch11s04.html#xcalc
[394]: http://www.catb.org/ch11s06.html#rogue
[395]: http://www.catb.org/ch11s06.html#id2959548
[396]: http://www.catb.org/ch11s07.html#id2960323
[397]: http://www.catb.org/ch13s01.html#complexity-sources
[398]: http://www.catb.org/ch18s05.html#docfig1
[399]: http://www.catb.org/ch18s05.html#docfig2
[400]: http://www.catb.org/ch18s05.html#docfig3
[401]: http://www.catb.org/ch08s02.html#regexp_table
[402]: http://www.catb.org/ch08s02.html#regexp_intro
[403]: http://www.catb.org/ch14s05.html#lang_usage
[404]: http://www.catb.org/ch14s06.html#x_toolkits
[405]: http://www.catb.org/ch05s01.html#passwd
[406]: http://www.catb.org/ch05s01.html#newsrc
[407]: http://www.catb.org/ch05s02.html#fortune
[408]: http://www.catb.org/ch05s02.html#planets
[409]: http://www.catb.org/ch05s02.html#xml_example
[410]: http://www.catb.org/ch05s02.html#ini_example
[411]: http://www.catb.org/ch05s03.html#smtp_example
[412]: http://www.catb.org/ch05s03.html#pop_example
[413]: http://www.catb.org/ch05s03.html#imap_example
[414]: http://www.catb.org/ch06s01.html#fetchmail_session
[415]: http://www.catb.org/ch06s01.html#SNG_Example
[416]: http://www.catb.org/ch07s02.html#pic2graph
[417]: http://www.catb.org/ch08s02.html#glade_example
[418]: http://www.catb.org/ch08s02.html#m4_macro
[419]: http://www.catb.org/ch08s02.html#xslt_example
[420]: http://www.catb.org/ch08s02.html#pic_source
[421]: http://www.catb.org/ch08s02.html#hogwarts
[422]: http://www.catb.org/ch08s02.html#rsa
[423]: http://www.catb.org/ch09s01.html#fetchmail_example
[424]: http://www.catb.org/ch09s01.html#conf_dump
[425]: http://www.catb.org/ch09s01.html#solution_code
[426]: http://www.catb.org/ch09s01.html#solution_caller
[427]: http://www.catb.org/ch09s02.html#ascii-splash
[428]: http://www.catb.org/ch09s02.html#star_list
[429]: http://www.catb.org/ch09s02.html#colon_table
[430]: http://www.catb.org/ch10s03.html#netrc
[431]: http://www.catb.org/ch10s06.html#X_config
[432]: http://www.catb.org/ch18s03.html#troffexample1
[433]: http://www.catb.org/ch18s03.html#man_example
[434]: http://www.catb.org/ch19s02.html#tar_trick