--- 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 . 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: 1969–1971][48] [Exodus: 1971–1980][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