100% found this document useful (1 vote)
13 views

PDF Wicked Cool Shell Scripts 101 Scripts For Linux OS X and UNIX Systems Dave Taylor Download

Systems

Uploaded by

pakicdzevat
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
13 views

PDF Wicked Cool Shell Scripts 101 Scripts For Linux OS X and UNIX Systems Dave Taylor Download

Systems

Uploaded by

pakicdzevat
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 62

Download the full version of the textbook now at textbookfull.

com

Wicked Cool Shell Scripts 101 Scripts for


Linux OS X and UNIX Systems Dave Taylor

https://textbookfull.com/product/wicked-cool-
shell-scripts-101-scripts-for-linux-os-x-and-unix-
systems-dave-taylor/

Explore and download more textbook at https://textbookfull.com


Recommended digital products (PDF, EPUB, MOBI) that
you can download immediately if you are interested.

Shell Programming in Unix Linux and OS X Stephen G. Kochan

https://textbookfull.com/product/shell-programming-in-unix-linux-and-
os-x-stephen-g-kochan/

textbookfull.com

Immersive Theater and Activism Scripts and Strategies for


Directors and Playwrights Nandita Dinesh

https://textbookfull.com/product/immersive-theater-and-activism-
scripts-and-strategies-for-directors-and-playwrights-nandita-dinesh/

textbookfull.com

Mastering Linux Shell Scripting a practical guide to Linux


command line Bash scripting and Shell programming Ebrahim

https://textbookfull.com/product/mastering-linux-shell-scripting-a-
practical-guide-to-linux-command-line-bash-scripting-and-shell-
programming-ebrahim/
textbookfull.com

THE PROBLEM OF THE RUPEE ITS ORIGIN AND ITS SOLUTION


History of Indian Currency Banking B.R. Ambedkar

https://textbookfull.com/product/the-problem-of-the-rupee-its-origin-
and-its-solution-history-of-indian-currency-banking-b-r-ambedkar/

textbookfull.com
Nanomaterial and Polymer Membranes. Synthesis,
Characterization, and Applications 1st Edition Tawfik Abdo
Saleh
https://textbookfull.com/product/nanomaterial-and-polymer-membranes-
synthesis-characterization-and-applications-1st-edition-tawfik-abdo-
saleh/
textbookfull.com

Machine Learning and Data Mining in Aerospace Technology


Aboul Ella Hassanien

https://textbookfull.com/product/machine-learning-and-data-mining-in-
aerospace-technology-aboul-ella-hassanien/

textbookfull.com

Accelerating the Transition to a 100 Renewable Energy Era


Tanay S■dk■ Uyar

https://textbookfull.com/product/accelerating-the-transition-
to-a-100-renewable-energy-era-tanay-sidki-uyar/

textbookfull.com

Knowing People The Val Kit Mystery Series Book 7 1st


Edition Rosalind Burgess

https://textbookfull.com/product/knowing-people-the-val-kit-mystery-
series-book-7-1st-edition-rosalind-burgess/

textbookfull.com

Social Theory 6th Edition Peter J. Kivisto

https://textbookfull.com/product/social-theory-6th-edition-peter-j-
kivisto/

textbookfull.com
Evidence Use in Health Policy Making: An International
Public Policy Perspective Justin Parkhurst

https://textbookfull.com/product/evidence-use-in-health-policy-making-
an-international-public-policy-perspective-justin-parkhurst/

textbookfull.com
E
2 TI
D
N O
I
D N
W ICKED COOL
SHELL SCRIP T S
• 11 0
0 11 S
SCCR R II P
PTTS
S FF OO RR LL II N NU UX X ,, O
OSS X
X ,,
AA N
ND D UUN
N II X
X SS YY SS TT EE M
M SS
• Image processing and editing tools

DAVE TAYLOR AND BR ANDON PERRY

was a contributor to BSD 4.4 UNIX, and his software


is included in all major UNIX distributions

Mono. In his free time, he enjoys writing modules for

• A ZIP code lookup tool that reports the city and state

• A Bitcoin address information retriever

• A suite of tools for working with cloud services like


PRAISE FOR THE FIRST EDITION OF WICKED COOL SHELL SCRIPTS

“A must for any new or intermediate-level Linux administrator. This is the


book that every other publisher tries to imitate.”
—LINUXWORLD

“I can’t give this book enough praise and high enough recommendation.
Quite simply, this is the book that I wish I would’ve had when I was just learn-
ing Linux.”
—STEVE SUEHRING, LINUXWORLD EDITOR

“A great resource for intermediate to experienced shell programmers.”


—WEBDEVREVIEWS

“If you’re interested in the command line and shell scripting, this is an
excellent book which will extend your knowledge and provide more than a
hundred ready-to-run scripts.”
—MACBLOG.COM

“There are a few books in the [computer] field that remain useful for years
and years after their publishing date. Wicked Cool Shell Scripts is one of those
fortunate few.”
—THE BRAINSHED

“Incredibly fun (really!) and chock full of scripts.”


—SLASHDOT
WICKED COOL
SHELL SCRIPTS
2ND EDITION
101 Scripts for Linux,
OS X, and UNIX Systems

by D av e T a y lo r a nd
Br a n d on P er r y

San Francisco
WICKED COOL SHELL SCRIPTS, 2ND EDITION. Copyright © 2017 by Dave Taylor and Brandon Perry.

All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.

20 19 18 17 16 123456789

ISBN-10: 1-59327-602-8
ISBN-13: 978-1-59327-602-7

Publisher: William Pollock


Production Editor: Laurel Chun
Cover Illustration: Josh Ellingson
Interior Design: Octopod Studios
Developmental Editor: Liz Chadwick
Technical Reviewer: Jordi Gutiérrez Hermoso
Additional Technical Reviewers: Therese Bao, Mark Cohen,
Matt Cone, Grant McWilliams, and Austin Seipp
Copyeditor: Paula L. Fleming
Compositors: Laurel Chun and Janelle Ludowise
Proofreader: James Fraleigh
Indexer: Nancy Guenther

For information on distribution, translations, or bulk sales, please contact No Starch Press, Inc. directly:
No Starch Press, Inc.
245 8th Street, San Francisco, CA 94103
phone: 1.415.863.9900; info@nostarch.com
www.nostarch.com

The Library of Congress has catalogued the first edition as follows:

Taylor, Dave.
Wicked cool shell scripts / Dave Taylor.
p. cm.
ISBN 1-59327-012-7
1. UNIX (Computer file) 2. UNIX Shells. I. Title.
QA76.76.O63T3895 2004
005.4'32--dc22
2003017496

No Starch Press and the No Starch Press logo are registered trademarks of No Starch Press, Inc. Other
product and company names mentioned herein may be the trademarks of their respective owners. Rather
than use a trademark symbol with every occurrence of a trademarked name, we are using the names only
in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.

The information in this book is distributed on an “As Is” basis, without warranty. While every precaution
has been taken in the preparation of this work, neither the authors nor No Starch Press, Inc. shall have any
liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or
indirectly by the information contained in it.
About the Authors
Dave Taylor has been in the computer industry since 1980. He was a
contributor to BSD 4.4 UNIX, and his software is included in all major
UNIX distributions. He is an award-winning public speaker and has written
thousands of magazine and newspaper articles. He is the author of more
than 20 books, including Learning Unix for OS X (O’Reilly Media), Solaris 9
for Dummies (Wiley Publishing), and Sams Teach Yourself Unix in 24 Hours
(Sams Publishing). A popular columnist for Linux Journal magazine,
he also maintains a customer tech support and gadget reviews website,
askdavetaylor.com.
Brandon Perry started writing C# applications with the advent of the open
source .NET implementation Mono. In his free time, he enjoys writing
modules for the Metasploit framework, parsing binary files, and fuzzing
things.

About the Technical Reviewer


Jordi Gutiérrez Hermoso is a coder, mathematician, and hacker-errant.
He has run Debian GNU/Linux exclusively since 2002, both at home
and at work. Jordi is involved with GNU Octave, a free numerical com-
puting environment largely compatible with Matlab, and with Mercurial,
a distributed version-control system. He enjoys pure and applied math-
ematics, skating, swimming, and knitting. Lately he’s been thinking a lot
about greenhouse gas emissions and rhino conservation efforts.
BRIEF CONTENTS

Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxiii

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv

Chapter 0: A Shell Scripts Crash Course. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Chapter 1: The Missing Code Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Chapter 2: Improving on User Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Chapter 3: Creating Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

Chapter 4: Tweaking Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

Chapter 5: System Administration: Managing Users . . . . . . . . . . . . . . . . . . . . . . . . . 117

Chapter 6: System Administration: System Maintenance . . . . . . . . . . . . . . . . . . . . . . 145

Chapter 7: Web and Internet Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

Chapter 8: Webmaster Hacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

Chapter 9: Web and Internet Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

Chapter 10: Internet Server Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

Chapter 11: OS X Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

Chapter 12: Shell Script Fun and Games . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

Chapter 13: Working with the Cloud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

Chapter 14: ImageMagick and Working with Graphics Files . . . . . . . . . . . . . . . . . . 313

Chapter 15: Days and Dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329

Appendix A: Installing Bash on Windows 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341

Appendix B: Bonus Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
CONTE NT S IN DE TA IL

Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxiii

INTRODUCTION xxv
What to Take Away . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxvi
This Book Is for You If . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxvi
Organization of This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxvi
Finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxx

0
A SHELL SCRIPTS CRASH COURSE 1
What Is a Shell Script, Anyway? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Running Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Configuring Your Login Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Running Shell Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Making Shell Scripts More Intuitive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Why Shell Scripts? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Let’s Get Cracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1
THE MISSING CODE LIBRARY 9
What Is POSIX? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
#1 Finding Programs in the PATH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
#2 Validating Input: Alphanumeric Only . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
#3 Normalizing Date Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
#4 Presenting Large Numbers Attractively . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
#5 Validating Integer Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
#6 Validating Floating-Point Input. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
#7 Validating Date Formats. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
#8 Sidestepping Poor echo Implementations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
#9 An Arbitrary-Precision Floating-Point Calculator. . . . . . . . . . . . . . . . . . . . . . . . . . . 34
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
#10 Locking Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
#11 ANSI Color Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
#12 Building a Shell Script Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
#13 Debugging Shell Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

x Contents in Detail
2
IMPROVING ON USER COMMANDS 51
#14 Formatting Long Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
#15 Backing Up Files as They’re Removed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
#16 Working with the Removed File Archive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
#17 Logging File Removals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
#18 Displaying the Contents of Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
#19 Locating Files by Filename . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
#20 Emulating Other Environments: MS-DOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
#21 Displaying Time in Different Time Zones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Contents in Detail xi
3
CREATING UTILITIES 79
#22 A Reminder Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
#23 An Interactive Calculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
#24 Converting Temperatures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
#25 Calculating Loan Payments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
#26 Keeping Track of Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

4
TWEAKING UNIX 97
#27 Displaying a File with Line Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
#28 Wrapping Only Long Lines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
#29 Displaying a File with Additional Information . . . . . . . . . . . . . . . . . . . . . . . . . . 101
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

xii Contents in Detail


#30 Emulating GNU-Style Flags with quota. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
#31 Making sftp Look More Like ftp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
#32 Fixing grep. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
#33 Working with Compressed Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
#34 Ensuring Maximally Compressed Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

5
SYSTEM ADMINISTRATION: MANAGING USERS 117
#35 Analyzing Disk Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
#36 Reporting Disk Hogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
#37 Improving the Readability of df Output. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

Contents in Detail xiii


#38 Figuring Out Available Disk Space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
#39 Implementing a Secure locate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
#40 Adding Users to the System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
#41 Suspending a User Account . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
#42 Deleting a User Account . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
#43 Validating the User Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
#44 Cleaning Up After Guests Leave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

6
SYSTEM ADMINISTRATION: SYSTEM MAINTENANCE 145
#45 Tracking Set User ID Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
#46 Setting the System Date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

xiv Contents in Detail


Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
#47 Killing Processes by Name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
#48 Validating User crontab Entries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
#49 Ensuring that System cron Jobs Are Run . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
#50 Rotating Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
#51 Managing Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
#52 Backing Up Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

7
WEB AND INTERNET USERS 173
#53 Downloading Files via FTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
#54 Extracting URLs from a Web Page. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

Contents in Detail xv
#55 Getting GitHub User Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
#56 ZIP Code Lookup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
#57 Area Code Lookup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
#58 Keeping Track of the Weather . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
#59 Digging Up Movie Info from IMDb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
#60 Calculating Currency Values. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
#61 Retrieving Bitcoin Address Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
#62 Tracking Changes on Web Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

xvi Contents in Detail


8
WEBMASTER HACKS 199
Running the Scripts in This Chapter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
#63 Seeing the CGI Environment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
#64 Logging Web Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
#65 Building Web Pages on the Fly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
#66 Turning Web Pages into Email Messages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
#67 Creating a Web-Based Photo Album . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
#68 Displaying Random Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

9
WEB AND INTERNET ADMINISTRATION 217
#69 Identifying Broken Internal Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

Contents in Detail xvii


#70 Reporting Broken External Links. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
#71 Managing Apache Passwords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
#72 Syncing Files with SFTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232

10
INTERNET SERVER ADMINISTRATION 235
#73 Exploring the Apache access_log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
#74 Understanding Search Engine Traffic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
#75 Exploring the Apache error_log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
#76 Avoiding Disaster with a Remote Archive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
#77 Monitoring Network Status. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255

xviii Contents in Detail


Visit https://textbookfull.com
now to explore a rich
collection of eBooks, textbook
and enjoy exciting offers!
#78 Renicing Tasks by Process Name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258

11
OS X SCRIPTS 261
#79 Automating screencapture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
#80 Setting the Terminal Title Dynamically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
#81 Producing Summary Listings of iTunes Libraries . . . . . . . . . . . . . . . . . . . . . . . . . 267
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
#82 Fixing the open Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271

12
SHELL SCRIPT FUN AND GAMES 273
#83 Unscramble: A Word Game. . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . 275
The Code . . . . . . . . . . . . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . 275
How It Works . . . . . . . . . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . 276
Running the Script . . . . . . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . 277
The Results . . . . . . . . . . . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . 277
Hacking the Script. . . . . . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . 277
#84 Hangman: Guess the Word Before It’s Too Late . . . . . . . . . . . . . . . . . . . . . . . . 277
The Code . . . . . . . . . . . . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . 278
How It Works . . . . . . . . . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . 279
Running the Script . . . . . . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . 280
The Results . . . . . . . . . . . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . 280
Hacking the Script. . . . . . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . 281

Contents in Detail xix


#85 A State Capitals Quiz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
#86 Is That Number a Prime? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
#87 Let’s Roll Some Dice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
#88 Acey Deucey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297

13
WORKING WITH THE CLOUD 299
#89 Keeping Dropbox Running . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 300
The Code . . . . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 300
How It Works . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 300
Running the Script . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 301
The Results . . . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 301
Hacking the Script. . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 301
#90 Syncing Dropbox . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 301
The Code . . . . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 301
How It Works . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 303
Running the Script . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 303
The Results . . . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 303
Hacking the Script. . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 304
#91 Creating Slide Shows from Cloud Photo Streams. . . . . . . . . . . . . . . . . . . . . . . . 304
The Code . . . . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 305
How It Works . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 305
Running the Script . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 306
The Results . . . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 306
Hacking the Script. . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 306
#92 Syncing Files with Google Drive . ........... . . . . . . . . . . . . . . . . . . . . . . . 307
The Code . . . . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 307
How It Works . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 308
Running the Script . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 308
The Results . . . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 308
Hacking the Script. . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . 309

xx Contents in Detail
#93 The Computer Says . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312

14
IMAGEMAGICK AND WORKING WITH GRAPHICS FILES 313
#94 A Smarter Image Size Analyzer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
#95 Watermarking Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
#96 Framing Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
#97 Creating Image Thumbnails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
#98 Interpreting GPS Geolocation Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327

15
DAYS AND DATES 329
#99 Finding the Day of a Specific Date in the Past. . . . . . . . . . . . . . . . . . . . . . . . . . 330
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
#100 Calculating Days Between Dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334

Contents in Detail xxi


Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
#101 Calculating Days Until a Specified Date. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339

A
INSTALLING BASH ON WINDOWS 10 341
Turning On Developer Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Installing Bash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Microsoft’s Bash Shell vs. a Linux Distro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344

B
BONUS SCRIPTS 345
#102 Bulk-Renaming Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
#103 Bulk-Running Commands on Multiprocessor Machines . . . . . . . . . . . . . . . . . . . 348
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
#104 Finding the Phase of the Moon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
How It Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Running the Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Hacking the Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353

INDEX 355

xxii Contents in Detail


Acknowledgments for the First Edition
A remarkable number of people have contributed to the creation and devel-
opment of this book, most notably Dee-Ann LeBlanc, my first-generation
tech reviewer and perpetual IM buddy, and Richard Blum, tech editor
and scripting expert, who offered significant and important commentary
regarding the majority of the scripts in the book. Nat Torkington helped
with the organization and robustness of the scripts. Others who offered
invaluable assistance during the development phase include Audrey Bronfin,
Martin Brown, Brian Day, Dave Ennis, Werner Klauser, Eugene Lee, Andy
Lester, and John Meister. The MacOSX.com forums have been helpful (and
are a cool place to hang out online), and the AnswerSquad.com team has
offered great wisdom and infinite opportunities for procrastination. Finally,
this book wouldn’t be in your hands without the wonderful support of Bill
Pollock and stylistic ministrations of Hillel Heinstein, Rebecca Pepper, and
Karol Jurado: Thanks to the entire No Starch Press team!
I’d like to acknowledge the support of my wonderful children—Ashley,
Gareth, and Kiana—and our menagerie of animals.

Dave Taylor

Acknowledgments for the Second Edition


Wicked Cool Shell Scripts has proven itself over the past decade as a useful
and encouraging read for anyone who enjoys bash scripting or wants to
learn more advanced techniques. In updating the second edition, Dave
and I hoped to give this book a breath of fresh air and to inspire another
decade of shell script exploration. This work to add new scripts and polish
up the explanations couldn’t have been done without the support of a lot of
people.
I would like to thank my cat Sam for sitting on my laptop while I was
trying to work, because I am sure he meant well and thought he was help-
ing. My family and friends have been completely supportive and under-
standing of my talking only about bash scripts for a good few months.
The No Starch Press team has been incredibly supportive of someone who
hadn’t authored anything more than high school papers or blog posts, so
huge thanks to Bill Pollock, Liz Chadwick, Laurel Chun, and the rest of the
No Starch team. Jordi Gutiérrez Hermoso’s input into technical aspects of
the book and code has been invaluable and greatly appreciated.

Brandon Perry
Random documents with unrelated
content Scribd suggests to you:
«—Sapristi! fit Ninon, c'est ce pauvre chevalier qui en a emporté
les morceaux!»
Mlle de Quinsonas faillit s'écrier: «—Madame! ces morceaux sont
en place!» Mais elle ne dit rien et fut beaucoup plus étonnée encore
qu'avant d'interroger Ninon, car si les morceaux avaient été remis
aux mains du chevalier, qui avait disparu, comment pouvaient-ils
avoir été rétablis à leur place?
Mais passons sur cet épisode qui est venu nous distraire des
poursuites amoureuses qu'avait à subir la gouvernante, du matin au
soir. La pauvre fille les évitait de son mieux, et avec d'autant plus de
soin, peut-être, qu'elle commençait à en être troublée. Non que la
figure du marquis fût fort affriolante, mais en somme c'était un
gaillard, bâti solidement, vigoureux et sain; et quand Mlle de
Quinsonas voyait se mouvoir ces mains immenses qui convoitaient
voracement sa chair inquiète, elle sentait quelque chose de
comparable à une fourmilière qui lui grouillait avec des millions de
petites pattes autour des reins, puis partait en campagne,
dégringolait, enveloppait le pays alentour, monts et vallées, enfin lui
causait une telle fatigue des membres inférieurs, que parfois elle
s'arrêtait dans sa fuite, comme si quelqu'un lui eût jeté le lasso.
Mais elle avait résolu de ne sacrifier jamais l'équilibre de sa
situation à la rapidité d'un plaisir, et elle éprouvait une grande
tristesse des imprudences du marquis, parce qu'elle savait que
l'opinion a tôt fait de loger dans le même sac une femme qu'on
courtise et une femme qui a succombé. Et elle souhaitait trouver un
moyen de se soustraire au danger imminent d'un scandale qui
pouvait la rejeter du jour au lendemain dans la petite maison
humide due à la générosité de son oncle l'évêque et située dans une
méchante ruelle, derrière la cathédrale. Elle craignait aussi
beaucoup, d'autre part, que Jacquette n'allât parler de ce qu'elle
avait vu au bassin de l'Amour, et elle n'osait pas interdire à la petite
d'en parler, de peur qu'elle ne le racontât plus vite encore, et à tout
venant.
Voilà donc où en est notre infortunée gouvernante. Que va-t-elle
faire?
Lorsqu'on a grande envie de se laisser aller à quelque chose de
mauvais, ou qui vous doit causer de graves ennuis, on va demander
conseil à quelqu'un dont on connaît à peu près exactement l'avis par
avance, et qui vous engagera à vous abstenir de l'action
répréhensible ou dangereuse. On sort de chez cette personne en se
disant: «Cette personne a certainement raison.» On fait quatre pas
en admirant comme elle pense conformément aux principes selon
lesquels nous avons été élevés, puis au cinquième pas on se dit:
«Mais, tout de même, je serais curieux de savoir ce que ferait cette
personne si elle se trouvait exactement dans mon cas.» Ce qu'elle
ferait? Mais, elle viendrait vous demander conseil.
Mlle de Quinsonas se fût adressée à Mme de Matefelon, si la
vieille se fût trouvée là; cela va sans dire. Elle pouvait encore
recourir, tout aussi bien, à M. l'abbé Pucelle, son confesseur. Je
n'affirmerais pas qu'elle ne lui parla pas de ses embarras; mais si je
la mène à confesse, le moyen, s'il vous plaît, d'avoir l'air de
connaître la réponse du vénérable ecclésiastique, puisqu'aucun
prêtre n'a jamais trahi le secret de la confession? Que diriez-vous de
conduire la gouvernante chez le baron de Chemillé? Il y a quelque
temps que nous n'avons vu ce bonhomme, et je me suis engagé, il
me semble, à vous mener une fois chez lui. Pourquoi Mlle de
Quinsonas n'aurait-elle pas eu l'idée de consulter, dans la détresse,
un philosophe, malgré que la tournure d'esprit de celui-ci fût tenue
pour paradoxale?
Justement, Mlle de Quinsonas alla interroger le baron de
Chemillé, parce qu'elle se promit, en souriant, qu'elle ne suivrait pas
ses avis, qui étaient au rebours du sens commun. Elle prit Jacquette
par la main, et toutes deux s'engagèrent dans un sentier conduisant,
en raccourci, à Montsoreau, où le baron habitait. Elles sonnèrent à
sa petite maison. Le portail était ombragé par un tilleul, et les
fenêtres du rez-de-chaussée garnies de glycine. Une très jolie
soubrette les introduisit dans la bibliothèque de M. de Chemillé. Une
odeur de poussière et de tabac y était répandue, bien que les deux
fenêtres fussent ouvertes sur un jardinet fleuri des roses de l'arrière-
saison.
M. de Chemillé leva ses besicles et fit fête à ses visiteuses. Il
donna aussitôt des livres d'images à Jacquette, et ayant compris que
Mlle de Quinsonas avait quelque chose de confidentiel à lui dire, il lui
fit signe qu'il l'écoutait.
Mlle de Quinsonas ne se défendit point d'être un tantinet
intimidée; aussi, comme elle avait l'intention de débuter par l'aveu
de son intrigue avec le marquis, elle parla de tout autre chose et
raconta le phénomène de la statuette restaurée.
«—Ne vous émerveillez point, dit le baron, que ce marbre ait été
restauré, même par l'effet d'un miracle; car cette image—que je ne
cesse d'admirer, pour ma part,—est le symbole d'une force vive,
éternelle sans doute, et qui prévaudra contre tous les petits coups
de marteau de l'honorable Mme de Matefelon et les vôtres, ma belle
enfant. Je prise tant l'œuvre de M. François Gillet, que je me refuse
à y voir un marbre périssable! Non! Vraiment, c'est une divine
substance qui s'élève au milieu de ce bassin; et vous me viendriez
raconter demain que vous avez vu le Cupidon se mouvoir, venir à
vous et vous faire frémir, mademoiselle, par un contact, non froid,
mais chaud, que je n'en serais pas le moins du monde étonné.»
Mlle de Quinsonas rougissait, elle toussicotait, et la nef arrondie
de son séant tanguait et roulait dans la mer de duvet d'une grande
bergère où elle était assise. De la main, elle chassait la vision de ce
coquin d'Amour s'avançant vers elle, non froid, mais chaud.
«—Fi donc! dit-elle, Monsieur, vous admettez aisément la liberté
dans l'amour!…»
«—La liberté! dit le baron, non point, car il est le plus farouche et
le plus puissant despote; mais l'aisance dans les rapports amoureux,
c'est notre revanche, mademoiselle, contre les coups de force de ce
butor. Il nous terrasse: plions les reins avec élégance.»
«—Eh quoi! faut-il nous livrer sans vergogne au premier
satyre…»
«—Je m'indigne, dit M. de Chemillé, que l'on fasse tant d'affaires
d'une intrigue amoureuse. Un rendez-vous ne prend d'importance
que par les difficultés dont on s'ingénie à l'embarrasser. Que n'y met-
on plus de simplicité et de bonne grâce! il ne pèserait pas sur notre
vie le poids d'un grain de tabac sur la main.»
«—Ah! Monsieur, puisque vous y allez de ce ton, permettez-moi
de vous exposer un cas.»
Et la voilà qui glisse à propos sa petite histoire.
Le baron lui dit aussitôt que pour ce qui était du désir amoureux
du marquis, il le comprenait fort bien, du moment que Foulques
négligeait sa femme, ce qui était son seul tort. Mais, étant donné
qu'il était vraisemblable que la marquise s'égayait avec le jeune
page, le marquis ne pouvait mieux diriger son choix…
«—Ah! Monsieur, je devrais bondir, et je sais comment il se fait
que je vous écoute!»
«—Je me garde bien de vous indiquer, Mademoiselle, ce que vous
devez faire: je vous expose ce qui se fait: l'amour, quand il prend
seulement la forme d'un gamin, nous fouette comme de vils
esclaves, à plus forte raison quand il adopte les apparences d'un
maître.»
«—Mais, Monsieur, en admettant que nous fassions taire nos
préjugés ou nos répugnances, il reste un trouble public, un
scandale!»
«—Il est, dit le baron, un attribut de l'amour que les artistes
oublient de joindre à son petit bagage ordinaire et que je tiens pour
le plus joli et le plus précieux: c'est le silence.»
Et comme Mlle de Quinsonas se levait, il ajouta:
«—Et souvenez-vous, Mademoiselle, qu'il ne se fait presque rien
d'efficace en ce monde, qui ne soit le fruit d'une opinion téméraire.»
En rentrant au château, Mlle de Quinsonas et Jacquette virent
une personne noire qui se promenait de long en large sur le perron
avec la marquise. Et elles reconnurent le vénérable curé de
Montsoreau, l'abbé Pucelle.
M. l'abbé Pucelle était venu demander à Mme la marquise si elle
entendait faire préparer Jacquette à la première communion, car elle
courait sur ses dix ans.—Comme le temps passe!—Ninon répondit
que telle était en effet son intention, et M. le curé lui donna
quelques avis touchant la manière de vivre qu'il lui semblait décent
d'adopter pour Jacquette pendant les deux années qui la séparaient
du grand jour. Il conseilla de ne lui laisser voir le monde que le
moins possible et de l'entourer d'exemples édifiants. Ninon, qui était
très contrariée de se livrer au péché si près de sa fille, trouva que le
curé disait des choses justes et décida de cloîtrer Jacquette et sa
gouvernante dans les anciens appartements de feu M. Lemeunier de
Fontevrault, qui se trouvaient pour ainsi dire isolés. On les prépara
donc de façon que Jacquette et sa gouvernante y pussent demeurer
à l'abri du va-et-vient de la maison.
En un clin d'œil toutes les difficultés contre lesquelles essayait de
lutter Mlle de Quinsonas se trouvaient résolues, ou du moins
paraissaient bien l'être, et la bonne fille se demandait s'il n'était pas
préférable, en toute occasion, au lieu de se mettre martel en tête, de
s'abandonner aux soins excellents de la Providence.
XVIII

LES AVENTURES DU CHEVALIER DIEUTEGARD.

Bien que je n'aie de dédain pour aucune des classes de la


société, je préfère éviter la compagnie des maçons, plâtriers,
peintres et ébénistes que l'on emploie à l'heure qu'il est, et pour
longtemps encore, c'est probable, aux anciens appartements de M.
Lemeunier de Fontevrault, afin de les transformer en gynécée. Nous
aurons l'occasion de revenir à loisir en ce lieu, où désormais deux
vierges,—non compris Pomme d'Api,—vont vivre à l'abri du siècle,
selon l'expression de M. l'abbé Pucelle. D'autre part, j'ai bonne envie
de revoir le pauvre chevalier, que nous avons laissé dans un triste
état, au moment où la nuit devenait noire et lorsque l'infortuné
jeune homme tomba sur la route.
Cette route était celle de Chinon, une petite ville bien jolie, bâtie
au pied et sur la pente d'une colline qui porte les débris d'un
château célèbre, et le souvenir de Rabelais, notre gros Shakespeare
à nous. C'est un endroit qui me plaît tant, que je n'en finirais pas de
le décrire, si mon sujet me le permettait; mais avouez qu'il serait
absurde de vous chanter une ville dans laquelle aucun de nos
personnages ne s'est aventuré.
Dieutegard était tombé sur le bord du chemin, succombant plutôt
au chagrin qu'à la fatigue, et il s'était endormi, là même, très
profondément. Il y fut réveillé, dès les premières heures du jour, par
un roulier qui faisait claquer fort son grand fouet et conduisait un
bruyant attelage. Le chevalier se frotta les yeux et revit la scène
mémorable de la veille, qui, pour lui, semblait fidèlement retracée
sur les sacs de blé entassés dans le chariot du roulier. Sur ces sacs, il
voyait nettement le dos de Ninon, sa peau nue, la fleur de son sein
tout à coup. Et Jacquette s'avançait à petits pas et tirait le drap sur
tout cela. A la place il n'y avait plus qu'une chevelure blonde de
fillette qui n'osait pas se retourner vers lui. Il eut parfaitement le
temps de voir tout, sur les sacs, avant que la lourde voiture eût
disparu vers la gauche, derrière un rideau de peupliers. Et il se leva
et fit quelques pas pour retrouver sur les sacs de blé les images qui
l'avaient poursuivi, la veille, en sens inverse, et l'avaient amené si
loin.
Mais la honte le ressaisit en même temps que l'air vif du matin lui
débrouillait les yeux, et il pensa gagner Chinon, puis y louer un
cheval et se faire conduire à Rochecotte, chez sa tante de Matefelon,
qui devait y arriver ce jour-là même.
Alors il se représenta en esprit, Rochecotte, qui était un beau
château, assurément, sur le bord de la Loire, comme celui de
Fontevrault, mais où Ninon ne viendrait jamais. Il vit cela, le pauvre
petit: un château superbe où Ninon ne viendrait jamais. Et à aucun
moment de sa vie il n'avait pensé quelque chose qui lui eût fait plus
de mal. Les pelouses, les terrasses, les charmilles, où Ninon ne
viendrait jamais; le son de la cloche au porche d'entrée, le ramage
des oiseaux, l'aboiement des chiens, que Ninon n'entendrait
jamais!… chaque nuit que l'on verrait tomber avec la certitude que
Ninon n'apparaîtrait pas!… chaque journée de soleil, chaque sourire
du ciel qui semblerait si vain, n'étant pas fait pour elle!…
Voilà comment Dieutegard n'alla pas jusqu'à Chinon, ne loua pas
de cheval et ne se trouva pas à Rochecotte au moment de l'arrivée
de Mme de Matefelon, ce dont celle-ci eut une surprise très vive et
désagréable.
C'était une excellente femme, qui aimait beaucoup son neveu;
mais vous n'attendez pas de moi que je vous tienne au courant de
ses angoisses. Que voulez-vous? on ne peut s'occuper de tout le
monde. Peut-être, le hasard aidant, vous donnerai-je de ses
nouvelles! J'avoue que la vieille dame m'est plus sympathique depuis
que je ne la vois plus bourdonner comme une mouche autour de ma
table à écrire. Mais nous sommes d'implacables bêtes, et quel que
soit le respect que nous professions pour les vieillards, nous ne
donnons notre cœur qu'au sang qui bout, qu'à la fleur qui
s'épanouit, qu'à ce qui s'élève vers la plénitude de la vie; et tout ce
qui penche la tête, et tout ce qui se flétrit, et tout ce qui est sur le
revers de la colline, environné par nous de soins hypocrites, ne
reçoit à aucun instant la flamme vive de notre attention.
Dieutegard suivit la voiture du roulier qui le ramenait vers
Fontevrault. Tout seul il n'eût peut-être pas eu la triste audace de
retourner aux endroits qu'il avait fuis; mais il chargeait les sacs de
blé de sa lâcheté amoureuse; il se laissait traîner par ce brutal
chariot. Le chariot ayant passé la rivière au premier bac, il la passa
avec lui; il marchait dans le voisinage du roulier et il répondait au
bavardage grossier de cet homme avec cette condescendance que
nous avons pour le cocher qui nous mène à un rendez-vous heureux.
Cependant, ayant abordé l'autre rive, le roulier prit un méchant
chemin qui descendait vers Bourgueil, et Dieutegard fut dans une
grande indécision sur le parti qu'il allait adopter. Car il se plaisait à
s'imaginer qu'un décret de la Providence avait fait passer cette
voiture pour l'engager à revenir vers Fontevrault; mais du moment
que la voiture s'éloignait de Fontevrault, il cessait de croire au décret
de la Providence. En outre, il ne voulait pas, vis-à-vis du roulier, avoir
l'air d'un jeune homme qui ne sait pas où il va; or, comme trois
chemins s'ouvraient précisément, en patte de canard, à l'endroit du
bac, il eût été curieux, pour le moins, que son chemin fût juste celui
du roulier. Il dit donc très haut à l'homme: «—Ah! vous allez par là,
vous? moi, non.» Et il s'élança résolument à côté, en jetant un
dernier coup d'œil aux images qui lui semblaient peintes sur les sacs
de blé.
Alors il s'aperçut que ces images avançaient maintenant devant
lui sur sa nouvelle route: le dos de Ninon prolongé en deux parties
gonflées, son épaule, un sein, puis la fleur de ce sein tout à coup.
Et il s'arrêta pour les voir plus à l'aise; il s'assit même. D'une
main il faisait signe à Jacquette de ne pas entrer. Mais la petite, mue
par un ressort secret, ouvrait invariablement la porte, allait déposer
sa poupée, revenait et rabattait le drap d'une main résolue. Il est
vrai que c'était toujours à recommencer. Bientôt ce jeu l'énerva. Il
dardait en face de lui des yeux stupides. Une fille passa, conduisant
un troupeau de dindons, et il se sentait attiré vers cette créature au
cotillon ignoble qu'il eût volontiers retroussé. Mais celle-ci s'étant
moquée de lui, un flot de larmes emplit sa poitrine et il se jeta sur le
bord du fossé en pleurant. Il ne savait pas au juste ce qui se passait
en lui, mais c'était son cœur qui lui faisait mal; son cœur, c'est-à-dire
son grand amour pour Ninon, l'amour qui lui faisait adorer Ninon
comme quelque chose de magnifique, de saint, d'auguste, de plus
beau que tout ce qui existe; enfin, si vous voulez, comme un bon
Dieu charmant. Et cet amour semblait perdu et remplacé par
quelque chose qu'une gardeuse de dindons eût été presque aussi
apte à satisfaire que la marquise de Chamarante!
Dieutegard n'avait plus de goût pour rien. Il resta longtemps où il
était. Le soleil n'avait plus l'air d'avancer; les heures étaient
interminables. Heureusement pour le pauvre chevalier, il eut faim,
car autrement il avait chance de se laisser abêtir tout à fait, ce qui
est à craindre quand l'amour vous a touché de cette façon-là. Mais
grâce au besoin de manger, qu'on dit vulgaire, Dieutegard se releva
et se retrouva plein d'énergie et de volonté, au moins pour un but
déterminé: déjeuner.
Dans ce pays-là c'est bien facile, car les maisons ne sont pas
rares, ni, dans les maisons, les poulets, les fromages exquis, le
beurre frais, le vin blanc ou le rouge, aussi délicieux l'un que l'autre,
voire même l'aménité chez les gens.
Vous pensez que le chevalier, qui était fort bien mis, et dont l'air
était si distingué, trouva crédit sans grande peine. Et il mangea bien,
malgré son malheur. C'était de son âge. Oui, oui, il mangea bien et
but de même. La bonne femme qui le servait le regardait avec le
paradis dans les yeux, tant elle était contente de voir un si gentil
monsieur faire honneur à sa cuisine. Elle tenait ses deux poings
appuyés sur les hanches et racontait qu'elle aussi avait un joli gars,
mais non si blanc, ni si mignon que lui.
Quand Dieutegard se fut bien restauré, il eut une pensée
joyeuse, et se dit que s'il rentrait en ce moment-ci tout bonnement
au château, il y serait probablement fort bien accueilli de tout le
monde, et qu'il était superflu de faire tant d'affaires pour ce qui lui
était arrivé. Mais cette pensée lui venait tout droit du vin de
Bourgueil qu'il avait bu et qui est la plus divine liqueur que l'homme
puisse goûter. L'ivresse que ce vin contient et communique ne dure
qu'un moment, ce qui est déjà très bien. Elle se dissipa vite. Le
chevalier demanda alors à son hôtesse comment elle s'appelait. Elle
dit qu'on la nommait dans le pays la mère Martin et que son fils et
sa bru étaient pour le moment à la foire de Beaufort, qui se tient
pendant cinq jours. Après quoi, Dieutegard fut sur le point de
raconter toute son histoire à la mère Martin. Par bonheur, il songea à
temps qu'il ne fallait pas compromettre la marquise. Il raconta
néanmoins son histoire, mais en changeant les noms et les lieux et
en omettant, bien entendu, tous les détails qui eussent pu être
désavantageux pour lui. La mère Martin l'écoutait avec admiration et
disait de temps en temps en joignant les mains: «Mon Dieu! faut-il;
mon Dieu! faut-il avoir tant de malheur quand on est si riche et
qu'on a une figure si avenante!»
Pendant qu'elle achevait ces mots, Dieutegard entendit le galop
d'un cheval, et alla voir à la fenêtre. Il pâlit tout à coup, et, pinçant
la manche de la mère Martin, il lui promit une grosse somme
d'argent si elle ne parlait pas de lui à l'homme qui montait ce cheval.
Puis il alla se blottir dans le cellier.
L'homme était le bon Fleury. Il parcourait le pays, tant par ordre
du marquis que de Mme de Matefelon pour retrouver le chevalier
disparu.
Il mit pied à terre et demanda à la mère Martin si elle n'avait pas
vu un jeune gentilhomme.
«—Non, dit la mère Martin; mais quel gentilhomme cherchez-
vous donc?»
Et elle offrit un verre de vin à Fleury, qui accepta et raconta tout
ce qu'il savait du chevalier Dieutegard, de la marquise de
Chamarante, de Châteaubedeau et du reste. De sorte que la vieille
n'eut qu'à répartir les vrais noms selon leur place, pour connaître
l'aventure de son pensionnaire. Celui-ci, qui entendait tout, pestait
très fort dans son cellier, et, sachant d'ailleurs que sa grand'tante se
courrouçait aisément, il s'imaginait qu'elle ne lui pardonnerait pas de
l'avoir ainsi abandonnée, au moment où elle quittait Fontevrault
dans des circonstances aussi désobligeantes pour son amour-propre.
Enfin il s'estima heureux que la mère Martin ne l'eût point trahi, et,
quand Fleury eut tourné les talons, il la remercia et lui promit autant
d'argent pour avoir été discrète qu'il lui en avait promis pour qu'elle
le fût.
De cette heure-là, Dieutegard n'osa plus sortir. Il se montait la
tête sous mille prétextes; il croyait aussi qu'au château, Jacquette
avait raconté la scène de la chambre de Ninon et que celle-ci le
faisait rechercher afin de lui infliger une humiliation exemplaire.
Le pauvre garçon n'était cependant point lâche; il eût affronté de
grands périls; mais le terrible amour l'avait jeté dans une situation
honteuse, où toute fierté se dissout. Réfléchissez à ceci, je vous prie,
que si ce jeune homme s'était précipité sur le corps de la marquise
et l'eût violé comme un soudard, il n'eût pas éprouvé de honte du
tout, et au contraire se fût taillé une belle renommée aux yeux des
autres et même aux siens. Car l'amour ne sourit qu'allié à l'audace et
à l'irrespect. Celui qui fléchit le genou devant l'objet des désirs de
son cœur s'engage à souffrir les plus nobles douleurs, certes, mais
les pires.
Le chevalier faisait de bons repas chez la mère Martin, et
couchait dans une chambre assez propre où il y avait deux lits: l'un
pour le fils Martin et sa femme, encore à la foire de Beaufort, l'autre
pour les hôtes de passage. Il voyait toujours Ninon, sur les murs
blancs ou sur les rideaux d'indienne, sur n'importe quoi; et, loin qu'il
s'accoutumât à cette image, il en était troublé davantage.
A l'heure où la nuit barbouille les murailles, quand les petits
crapauds tapent sur leur enclume dans les champs, et que la lune,
marchande d'images, nous donne à choisir entre mille esquisses
fantasques, le corps de Ninon sortait tout vivant de l'ombre, et le
chevalier se dressait sur son séant pour l'étreindre. Si cette belle
masse de chair était en retard, il l'appelait en fermant les yeux et
disant: «Viens, chère épaule, cher sein», etc., car il nommait chaque
partie par son nom. Mais, chose étrange, quand il nommait quelque
endroit de cette chair bien-aimée, il ne prononçait pas le nom de
Ninon; il s'en apercevait bien, en souffrait, car jadis ce nom seul le
comblait d'un ravissement incomparable. Il lui paraissait sacrilège de
mêler ce nom à sa débauche imaginaire.
Franchement, c'était bien dommage qu'une âme si délicate et
qu'une si tendre jeunesse de corps fussent réduites à embrasser des
fantômes. Une femme en eût reçu tant d'agrément!
Comme il n'avait aucune occupation, la longueur des journées
favorisait son malheureux penchant aux souvenirs, et l'absence de
Ninon rendait ceux-ci plus aigus. Il commençait à sentir les effets de
l'affreux poison de l'absence, qui pénètre le sang et la moelle petit à
petit et, au bout de peu de temps, vous ronge la chair et les os. Il
écrivait les initiales de Ninon sur l'écorce des arbres, ou sur la terre,
en la labourant de son pied; il les imprima aussi sur son linge de
corps, en lettres de sang, grâce à une piqûre qu'il se fit à la main
avec une longue épine. Et, toutes les fois qu'il traçait une de ces
lettres, il s'arrêtait dans sa besogne, les yeux intimidés, les gestes
gauches, gêné dans toute sa personne comme par l'arrivée d'un être
étranger, qui se blottissait contre son ventre. Il se roulait par terre,
agité d'une ivresse sombre et farouche, dont il ne savait s'il devait
souhaiter la prolongation ou la fin.
Des petits porcs, qui erraient en liberté dans la cour de la mère
Martin, ou galopaient en grognant, l'approchaient et le touchaient
quelquefois de leur groin dégoûtant, et lui, qui d'ordinaire eût fui ces
vilaines bêtes, ne faisait pas un mouvement pour les éloigner, car il
se croyait voué aux persécutions immondes. Quand sa folie le
prenait, il attendait les porcs; le seul aspect des porcs provoquait
aussi sa folie. Peu à peu ces cochons se lièrent aux représentations
qu'il se faisait du corps de Ninon, et la colère, l'horreur et le dégoût
qu'il éprouvait de ce mélange aggravaient son enivrement.
Il maigrissait, ses beaux yeux s'enfonçaient dans des puits aux
margelles grisâtres. La mère Martin lui disait de prendre garde et
qu'il se pourrait bien qu'il couvât une maladie.
Enfin, le quatrième jour, la bru revint de la foire de Beaufort,
conduisant elle-même une charrette où il y avait six veaux. C'était
une forte femme, jeune, sentant l'ail et portant sous sa cotte un sac
d'écus de la grosseur d'un jambon, qui lui frappait les cuisses,
alternativement, quand elle marchait ou tirait les veaux par la corde
pour les faire entrer dans l'étable. Ce fut un divertissement. Il fallut
lui raconter toute l'aventure du chevalier, qui lui parut extraordinaire
et peu croyable. Elle n'ajoutait point foi à la vérité, mais croyait
Dieutegard, à son habit et à son air distingué, un prince, pour le
moins un bâtard du roi. Elle dit qu'elle avait laissé son homme saoûl,
à Beaufort, et qu'on ne le verrait certainement pas avant vingt-
quatre heures.
Le chevalier alla se coucher après souper et s'endormit plus
aisément qu'à l'ordinaire, parce que la bru de la mère Martin, ou
Joséphine, l'avait amusé un peu avec ses veaux, son sac d'écus, son
incrédulité, sa crédulité et son mari ivre-mort.
Mais, vers le milieu de la nuit, ses rêves habituels, dont la
turpitude augmentait sans cesse, vinrent le tirer du sommeil. Cette
fois-ci il voyait la pauvre petite Jacquette dans un rôle odieux, juste
contraire à celui qu'elle avait joué, qui venait le chercher pour le
mener dans la chambre de sa mère et qui, au lieu d'abriter
chastement le corps de celle-ci comme elle l'avait fait, relevait le
drap entièrement et dévoilait au chevalier haletant tous les retraits
d'une chair admirable devenue par l'horrible circonstance une source
d'impudicité.
Et, entr'ouvrant les yeux dans l'accès de fièvre que la luxure lui
causait, l'infortuné chevalier vit contre le lit voisin une femme très
grasse qui s'épuçait à la lueur fumeuse de la chandelle. Était-il
complètement éveillé? ce n'est pas certain. Il saute à bas du lit,
saisit à bras-le-corps Joséphine qui pousse un cri, lâche la lumière,
puis se laisse rouler sur le lit et sur le corps éperdu du chevalier.
De toutes les causes de tristesse que nous offre le spectacle du
monde, je crois bien qu'une des plus détestables est l'appétit bestial
qui, par la permission d'un dieu cruel, envahit parfois de préférence
une âme et un corps délicats. J'ai tant de pitié de mon pauvre
chevalier que je voudrais ne pas m'étendre sur une épreuve à ce
point odieuse. Vous rappelez-vous la suavité de ses impressions et
de ses sentiments, au bord du bassin de l'Amour, alors que les
caresses de Ninon, sans atteindre ses sens, faisaient déborder les
parfums dont son jeune cœur était plein? Ne semblait-il pas créé
pour goûter ce que l'amour a de délicieux? Et le voilà sur ce lit,
tenant la place d'un ivrogne, contre une créature aussi éloignée de
son noble sang que l'eût été la génisse que l'on entend beugler dans
l'étable. Cette maritorne mal odorante et souillée de vermine, il la
presse de ses fines mains; cette croupe difforme et bleuie par le
choc des écus, il la baise de ses lèvres; devant un corps qu'il n'a
jamais désiré ni vu même, il s'agenouille, il l'adore, il l'exhausse en
son esprit jusqu'à cette région céleste où l'illusion que l'on se
confond en la matière universelle ou bien en Dieu, nous fait
hoqueter et défaillir d'extase. Mais le pauvre petit, las d'embrasser
d'idéales ombres, palpe enfin quelque chose de réel. Mystère
profond! Défaite du rêve! Abdication de la splendeur des créations
de l'esprit en faveur du plus abject morceau de viande, mais vivant!
De ce que cette femme éprouva, vous pensez bien que je ne vais
pas vous entretenir: cela lui est bien égal!
Quand le démon qui gonfle la misérable chair de l'homme se fut
écoulé de son corps, le chevalier sentit dans sa bouche un goût plus
amer que s'il avait mangé des excréments; il eut des nausées et
vomit. Puis il pleura abondamment et voulut retourner dans son lit.
Mais Joséphine, trop fière de posséder un prince entre ses draps, ne
le laissa pas s'en aller. Elle le caressa de nouveau. Il se débattait et
mâchait le drap pour ne point hurler sa répugnance. Mais la femme
ramena le démon sous sa rude main, et Dieutegard embrassa une
seconde fois et aima jusqu'au délire ce qui lui soulevait le cœur.
Enfin les images de Ninon vinrent couvrir l'horreur de ces
dégradants plaisirs; la chandelle éteinte et les narines serrées, il ne
reconnaissait plus la femme de l'ivrogne de Beaufort, et il criait de
volupté entre ses gros bras, croyant embrasser Ninon elle-même,
quand l'ivrogne entra, plus tôt qu'on ne l'attendait.
Cet homme était de taille à briser le chevalier entre ses doigts.
Par bonheur, à la vue de ce qui se passait dans son lit, cette brute,
au lieu de châtier les coupables, rompit les meubles qui se trouvaient
sous sa main, ce qui lui occasionna sans doute une grande fatigue,
car il tomba après cela tout de son long et ronfla presque aussitôt.
Et voilà notre chevalier obligé de fuir en pleine nuit, malgré la
mère Martin qui s'était levée en chemise et courait après lui, pieds
nus, pareille à une vieille sorcière, et lui réclamant son dû. Mais les
préoccupations de Dieutegard n'étaient point de cet ordre-là; il ne
pensait qu'à l'épaisse honte dont son cœur débordait.
Il se trouva par hasard au bord de la Loire, qui jetait une lueur
par endroits, comme un miroir dans la nuit; et il s'assit en attendant
le jour.
Il pensait à tout ce qu'il avait désiré de pur et de splendide,
durant plusieurs années, sous les charmilles et près des bassins du
parc de Fontevrault, en lisant des poètes. En vérité, il s'était créé un
monde de beauté qui depuis longtemps environnait son front et le
suivait partout. Il n'avait jamais aperçu la vilaine face des choses. Il
se rappelait son orgueil, lorsque enivré de poésie, il remontait les
marches de marbre sous le pin parasol, vis-à-vis le vase au bas-relief
de satyres; et tout lui semblait mener à un royal amour, d'une
manière aussi sûre que les belles et droites allées du parc
convergeaient au pied du château où vivait Ninon.
A ce moment, il osa élever son esprit vers Dieu et lui dit:
«Mon Dieu, qui passez probablement en ce moment-ci à travers
les étoiles, trop haut pour m'entendre, j'éprouve cependant le besoin
de vous parler. J'ai le cœur si gros, si gros, qu'il n'est pas possible
que vous ne vous en aperceviez pas, même de loin. Alors prenez-
moi en pitié, parce que je ne suis pas méchant et n'ai jamais eu de
mauvaise intention en ce que j'ai fait. J'aime à en mourir Mme la
marquise de Chamarante, la plus belle de vos créatures. Cette
femme merveilleuse m'a caressé un jour au bord du bassin, et j'ai
été trop ému pour faire comme cela, à l'improviste, ce que vous avez
décidé de toute éternité qu'un homme doit faire en pareil cas pour
plaire aux femmes. Et je crois que Ninon ne me l'a pas pardonné. A
côté de cela, il y a Châteaubedeau qui n'est qu'un gros patapouf et
qui s'en paie jusque-là avec la marquise, sans l'aimer, je le sais. Lui
est là-bas, au château; et moi je couche dehors, comme vous voyez,
au bord de la Loire. Et il m'est arrivé des choses abominables! Voilà
tout; je tenais seulement à vous prévenir… Maintenant vous savez,
mon Dieu, combien je suis un admirateur fervent de tout ce que
vous faites, et, quoi qu'il arrive, je resterai animé pour vous d'un
invincible amour et d'une respectueuse terreur.»
Dieutegard n'avait pas du tout espoir en l'efficacité de sa prière;
mais il la faisait cependant, comme feront toujours la plupart des
hommes jusque dans les temps les plus avancés. Il se releva aussitôt
après et vit l'aube qui répandait la rosée sur les collines de Chinon.
Le frais et charmant début du jour donne de l'espérance à l'homme
le plus découragé; aussi le chevalier sentit le jeune soleil animer ses
jambes et partit, suivant au bord de l'eau le chemin de halage. Il ne
souhaitait plus guère autre chose, dans le domaine du possible, que
de voir, par-dessus les arbres, le sommet du gros colombier de
Fontevrault.
La pureté du matin lui permit de penser à Ninon comme
autrefois. Ce fut peut-être aussi la bonté de Dieu qui lui accorda ces
quelques minutes exquises, durant lesquelles il fit beaucoup de
chemin. Les oiseaux chantaient, les troupeaux descendaient dans les
prairies, les poissons de la Loire montaient baiser à la surface de
l'eau la lumière du jour, et le chevalier encadrait l'image de sa bien-
aimée dans les ondes qu'ils laissaient sur l'eau paresseuse.
Tout à coup Dieutegard vit une tête d'homme roux, et il reconnut
Cornebille. Mais, au lieu de concevoir l'effroi que le sorcier répandait
habituellement, il fut heureux jusqu'en la profondeur de son cœur de
retrouver quelqu'un qui avait approché de près Ninon. Et au lieu de
l'éviter, il alla vers lui.
Cornebille n'éprouva pas à le revoir le même plaisir que lui, car il
était en train de retirer ses verveux sans avoir aucun droit au
privilège de la pêche. Mais le mécontentement qu'il reçut de ce chef
fut mélangé à la surprise de voir le chevalier, que l'on cherchait dans
tous les coins du pays. Enfin vint à l'esprit de Cornebille le souvenir
d'une après-midi d'autrefois, bien marquée dans sa mémoire, à
savoir celle où le chevalier descendit au fond du parc et entra dans
la petite maison du jardinier pour lui signifier le congé de la
marquise. A cause de cela, Cornebille ne lui voulait pas de bien. Mais
Dieutegard, lui, ne se souvenait pas de cette circonstance, parce
qu'il n'avait pensé qu'à faire plaisir à Ninon, nullement à ennuyer
Cornebille.
Le chevalier dit simplement:
«—Oui, c'est moi. Est-ce que vous allez bien, Cornebille?»
Cornebille ne parla pas si vite, parce qu'il était prudent et pesait
ses paroles.
Il réfléchit, tout en faisant passer dans un sac de toile le poisson
qu'il avait pris, et dit au chevalier qu'il s'étonnait beaucoup de le voir
là, pendant qu'on avait tant de mal à savoir où il était. Dieutegard lui
demanda si les recherches duraient encore.
«—Pas plus tard que tout à l'heure, dit Cornebille, un nommé
Martin est passé là, à bride abattue, en demandant M. le chevalier;
même que le voilà bien arrivé au château à l'heure qu'il est, s'il court
encore.»
Le chevalier dut s'asseoir sur un gros caillou, au bord de l'eau,
car les paroles de Cornebille lui avaient retiré d'un coup tout le sang
du corps.
Si l'ivrogne Martin le poursuivait et allait raconter au château
l'aventure de la nuit, comment jamais—en admettant qu'il osât
reparaître devant Jacquette et devant la marquise,—comment jamais
faire accroire à celle-ci qu'il se mourait d'amour pour elle dans les
bras d'une femme de campagne, nommée Joséphine? Ce n'était pas
de Martin qu'il avait peur, mais de cela!
Et Cornebille, de son œil louche, voyait bien que le chevalier se
rapetissait et tremblotait sur son caillou. Il en augura que le jeune
homme avait commis quelque fredaine peu catholique et qu'il se
trouverait volontiers à l'abri entre quatre murs. Il lui offrit donc de
venir chez lui, sous le prétexte que le matin était frisquet. Et il
pensait, par derrière la tête, que moyennant l'hospitalité, le chevalier
serait discret sur sa pêche. Dieutegard ne dit pas non et le suivit.
Cornebille habitait à présent une toute petite cabane, dissimulée
sous les saules, non loin de la maison du passeur, au bac d'Ablevois.
Sa femme avait dû s'engager comme servante depuis le malheur qui
avait chassé du château le paisible ménage, et ses petits enfants
eux-mêmes s'étaient loués dans les fermes. Lui seul demeurait là,
vis-à-vis les pignons de Fontevrault, empêché de travailler,
prétendait-il, par un sort qu'on lui avait jeté et qui le faisait tomber
du haut mal s'il touchait seulement la terre. Tout indiquait qu'il vivait
de rapines. Sa personne déguenillée inspirait l'inquiétude et la pitié;
quant à son toit, il était sordide.
Ce fut là, par une suite de circonstances tenant tant du hasard
que de l'état d'esprit du chevalier, que celui-ci échoua et vint achever
de briser son frêle cœur.
Certes, c'est un assemblage disparate que celui de ces deux
hommes, Cornebille et le chevalier; l'un si laid, l'autre si gracieux.
Qui jamais eût songé à les réunir? Celui-là même qui a créé le cœur
de l'homme plein de mystère, y avait songé. Car vous savez déjà
que l'amour d'une même femme avait pénétré l'âme et le sang de
Cornebille et du chevalier.
Cornebille n'avait pas recouvré la paix depuis le jour néfaste où le
corps de la marquise lui était apparu enlacé à l'Amour de marbre, au
travers des arbustes dégarnis par l'automne; et le fait d'avoir été
chassé du château n'avait été qu'un médiocre épisode au prix de la
terrible perturbation apportée dans sa cervelle par un regard
indiscret. Tel était le sort qu'on lui avait jeté. Ses forces et son
courage étaient à bas; il n'avait plus de bras pour nourrir sa famille,
et lui-même végétait d'une vie quasi-animale, ne retrouvant de cœur
que la nuit, pour pénétrer clandestinement dans le parc de
Fontevrault, se faufiler au long des allées du labyrinthe et rendre son
culte à l'Amour qui l'avait blessé, mais que Ninon avait enserré de
ses bras et baisé, un jour.
Dieutegard découvrit le secret qui rongeait Cornebille, et il n'en
fut pas jaloux, contrairement à ce qui arrive ordinairement en pareil
cas. C'est qu'il sentait bien que Cornebille n'aurait jamais qu'à
souffrir d'une passion si disproportionnée et qu'il ne serait jamais un
rival pour lui. Il avait été à peine jaloux de Châteaubedeau, parce
qu'il ne lui semblait pas possible que Ninon pût l'aimer comme elle
l'eût aimé, lui.
Mais lorsque Cornebille connut l'amour de Dieutegard, il eut
envie de fondre sur lui à coups de pieds et à coups de poings et de
le jeter, bien meurtri, dans la Loire. Cependant il se contint et ne
laissa jamais rien paraître de la démangeaison qu'il avait. Tantôt son
œil brillait comme celui d'un loup, lorsqu'il regardait le chevalier;
tantôt c'étaient des cajoleries maternelles, car il espérait sans doute
tirer parti de lui.
D'ailleurs, il haïssait Châteaubedeau plus que Dieutegard; et
toutes les fois qu'il entendait le nom de l'amant heureux de la
marquise, Cornebille étranglait quelque chose: une ombre, une
vision, entre ses doigts noueux.
Il emmena Dieutegard avec lui dans le parc. Les chiens le
connaissaient de longtemps et venaient lui lécher les mains. Ils firent
bon accueil à Dieutegard.
Cornebille et le chevalier allaient non seulement au bassin, mais,
par les nuits noires, ils s'approchaient du château, le plus près
possible. Ils ne voyaient absolument rien. Mais ils savaient où étaient
placées les fenêtres de Ninon, et ils s'accroupissaient au pied du
mur, sans parler et sans souffler, heureux d'être moins éloignés
d'elle, jusqu'aux premières lueurs du jour.
Dieutegard apprit aussi que Cornebille voyait l'ancienne nourrice,
Marie Coquelière, femme crédule qu'il avait domptée par la peur,
grâce à sa renommée de sorcier. Elle s'aventurait à certains jours
jusqu'au bord de la rivière, et Cornebille, surgissant là comme par,
enchantement, lui tirait mille détails concernant Ninon. Elle vint, un
jour de pluie, jusqu'à la cabane, et vit le chevalier. Mais elle se crut
morte ou le prit pour un revenant. Puis, ayant recouvré ses sens, elle
se mit à pleurer. Il lui demanda pourquoi: elle se refusa à dire qu'elle
avait grande pitié de l'état dans lequel elle le rencontrait. Il
l'interrogea sur l'opinion que Ninon conservait de lui. Mais la vérité
était que Ninon ne pensait rien de lui. Depuis longtemps déjà on
avait cessé de prononcer son nom. Mme la marquise sortait avec M.
de Châteaubedeau. Mlle Jacquette était cloîtrée avec Mlle de
Quinsonas, en attendant sa communion.
Vous savez que la première impression qu'ont les bonnes gens en
présence d'une situation est de la trouver naturelle. Marie Coquelière
avait, il est vrai, été surprise de retrouver le chevalier qu'on disait
perdu. Mais, le voyant vivant, elle fut un bon moment avant de se
demander pourquoi il était là et ce qui l'obligeait à demeurer dans le
bouge infect de Cornebille et dans la compagnie de ce sorcier. Elle se
mit à pleurer quand l'idée lui vint de s'en informer. Mais le chevalier
fut étonné à son tour, car il était maintenant accoutumé à sa misère
et n'éprouvait plus guère d'autre besoin que d'aller s'accroupir la nuit
sous les fenêtres de Ninon.
XIX

VOICI UN CHAPITRE BIEN LONG! MAIS QUELLE GRAPPE D'ÉVÉNEMENTS! ON


VOUS TRANSPORTE AU GYNÉCÉE OU APPARTEMENT RÉSERVÉ DE CES
DEMOISELLES, ET VOUS Y ÊTES TÉMOINS D'UN ENCHAÎNEMENT DE FAITS
QUI NOUS AMÈNE À UNE CONCLUSION MORALE, UN PEU PESSIMISTE,
QU'EXPRIME ADMIRABLEMENT NINON EN LEVANT LES DEUX JAMBES À LA
FOIS.

Marie Coquelière fut bien plus troublée, une fois revenue au


château, que lorsqu'elle reconnut le chevalier Dieutegard chez
Cornebille. Elle ne parlait jamais de ses entrevues avec le sorcier,
parce que celui-ci inspirait l'épouvante, et ce secret lui était si dur à
porter qu'elle en avait maigri de treize livres depuis que cela durait,
et que sa figure, auparavant prospère, se plaquait de teintes
jaunâtres. Mais ne pas dire qu'elle avait vu le chevalier lui valut une
maladie. Et, tandis qu'elle était au lit, au milieu de ses étouffements,
elle rendit cette nouvelle et respira enfin.
On la crut folle personne n'ajouta foi à ses sornettes. Cependant
l'idée était si cocasse du chevalier Dieutegard croupissant par amour
dans la vermine avec l'horrible sorcier Cornebille, que l'on s'en
empara comme d'une légende tragi-comique, et elle fut longtemps
l'aliment des plaisanteries.
Une nuit même, que Châteaubedeau et la marquise roucoulaient,
la fenêtre ouverte, le page se plut à renverser le vase de nuit au
pied de la muraille, par dérision, en disant hautement qu'il
compissait le Sorcier et le Chevalier des contes de Marie Coquelière.
Mais Ninon, ayant penché la tête à ce moment, crut voir deux
ombres qui fuyaient, et elle pâlit aussitôt et se trouva mal. Pendant
le reste de la nuit elle crut à la vérité de la légende; mais le jour
dissipa les frayeurs superstitieuses de son esprit.
La légende avait pénétré dans le gynécée, où il faut vous mener,
à présent que les maçons en sont partis.
Si parfaits qu'eussent été leurs travaux, vous voyez donc qu'ils
laissaient transpercer quelques bruits du dehors. A la vérité, Marie
Coquelière, en qualité d'ancienne nourrice, y jouissait d'un droit de
passage. C'était elle qui apportait le petit déjeuner du matin et
servait les autres repas. Hormis elle, le marquis et la marquise seuls,
ainsi que le vénérable abbé Pucelle, devaient, à jours et heures
déterminés, franchir la petite porte conduisant aux appartements
réservés de Jacquette, et de Mlle de Quinsonas.
De toutes les personnes de la maison, Mlle de Quinsonas était
l'unique qui osât ne point traiter de balivernes les histoires de Marie
Coquelière. C'est qu'elle se souvenait de la rencontre de Cornebille,
au petit jour, dans les allées du labyrinthe, et de l'entretien
merveilleux de ce lieu ainsi que de la statuette de l'Amour, ce qui,
effectivement, pouvait être le fait d'une grande passion. Et Jacquette
s'était beaucoup enflammée sur l'aventure, à cause de ce qu'elle
contenait de romanesque, ce qui ne lui semblait pas opposé au
caractère de son ancien ami le chevalier Dieutegard. Et elle disait à
Pomme d'Api:
«Tu me demandes, ma chère Pomme d'Api, de te raconter
l'histoire du chevalier Dieutegard. Je n'y vois pas d'inconvénient,
parce que tu n'es pas, toi, sur le point de faire ta première
communion; mais, quand tu en seras là, je te préviens que je te
renfermerai dans une boîte et sous clef. Voilà: ce jeune homme était
tombé amoureux de maman. Quand un jeune homme est amoureux,
—à moins que ce ne soit d'une jeune fille à marier,—il est
convenable qu'il se tienne caché parce qu'il lui devient impossible de
chausser ses culottes. C'est comme cela. Voilà pourquoi tous nos
galants s'enferment; voilà pourquoi on ne doit pas regarder la
statuette de marbre qui est au milieu du bassin: le petit coquin est
tout nu, et c'est l'Amour lui-même. Or, Dieutegard ayant reconnu son
état, un jour, dans la chambre de maman, s'est sauvé, et depuis ce
temps-là il se cache. C'est un jeune homme très comme il faut. Là-
dessus, comme sur tout le reste, chacun bâtit des histoires; mais ce
n'est pas la peine que tu ailles te monter la tête à ton tour. Je sais à
quoi m'en tenir.»
L'aile du château affectée depuis des mois déjà à abriter
l'innocence de Jacquette, se composait, comme on sait, des anciens
appartements de feu M. Lemeunier de Fontevrault, mis d'abord en
partie à la disposition de la gouvernante, puis restaurés, isolés et
abandonnés totalement à Jacquette, à Mlle de Quinsonas et à
Pomme d'Api. Vers la fin de l'automne, on permit qu'une chatte s'y
établît à demeure, pour y détruire les souris d'abord, ensuite pour
apporter un peu de gaieté aux solitaires. C'était une chatte noire, de
poil ras, qui avait deux yeux d'un jaune éclatant et l'air d'un diable:
M. le curé lui-même la nomma Belzébuth, nom d'un démon; c'est
pourquoi Marie Coquelière l'appela aussitôt «la belle Zébute».
Vous vous souvenez sans doute que, des fenêtres de cet
appartement situées au couchant, l'œil plongeait obliquement dans
l'allée des fontaines, terminée par le pin parasol; que l'on voyait
aussi, par-dessus les marronniers, le ventre rond et le haut toit
moussu du colombier; enfin, qu'au bas des fenêtres s'étalait un petit
parterre à la française, bordé d'une grille. C'est ce jardin qui était
désormais réservé aux promenades et aux jeux de Jacquette. Encore
avait-on fait grimper de hauts lierres sur la grille afin de mieux
marquer l'enclos qu'occupaient ces demoiselles, au milieu d'une
demeure et d'un parc livrés au désordre de la vie profane.
M. le curé venait deux fois la semaine donner sa leçon de
catéchisme; M. de Chemillé faisait le dimanche à sa filleule une visite
de cérémonie, ainsi que les hôtes de Fontevrault, tous un peu
guindés, rangés en cercle et ne sachant que dire, à cause du ton
châtié qui leur était recommandé. Les jours paraissaient parfois
longs dans le gynécée, et Jacquette aspirait avec ardeur à la date de
sa communion, d'autant plus qu'on lui avait promis qu'elle ferait,
aussitôt après, son entrée dans le monde et, selon l'usage du temps,
s'y marierait, dans un assez bref délai.
Quand le vent d'automne faisait courir les feuilles mortes dans
l'allée des fontaines, on pouvait voir, à l'une des fenêtres du petit
parterre, une haute personne soufflant une forte buée sur les vitres:
c'était Mlle de Quinsonas; et, sous la gorge opulente qui jouait le
rôle d'un baldaquin étoffé, une tête aplatie au front, au nez, et dont
la bouche, lippue comme celle d'un affreux nègre, donnait assez
bien l'aspect d'un gros et gras limaçon vu en dessous et rampant:
c'était la tête de Jacquette, déformée pour le plaisir de s'appliquer
contre la vitre. Elles demeuraient là jusqu'à ce qu'il fût l'heure
d'allumer les lampes.
M. l'abbé Pucelle avait fait suspendre la lecture de Plutarque,
jugée pour le moment un peu païenne, et l'on se contentait de lire le
Nouveau Testament ou de répéter le catéchisme, du matin au soir.
Pomme d'Api, qui assistait à toutes les leçons, se montrait à l'égard
du catéchisme, d'une inaptitude allant parfois jusqu'à la rébellion;
aussi Jacquette coupait-elle ces exercices ardus par de grands
mouvements de colère contre sa fille et par des châtiments
corporels, tel celui qui consistait à la livrer, corps et biens, à la belle
Zébute figurant Satan. La belle Zébute roulait Pomme d'Api comme
pelote de laine, lui labourait la poitrine de ses ongles fins, et mettait
ses vêtements en lambeaux. Ces scènes amusaient énormément
Jacquette et trouvaient grâce devant la gouvernante, qui se relâchait
un peu de sa gravité depuis qu'elle avait recouvré la paix à l'abri du
gynécée.
Je m'avance un peu en affirmant que Mlle de Quinsonas avait
recouvré la paix. Qu'est-ce que l'on peut jamais affirmer de ces
natures-là et de malheureuses filles dans une situation aussi étrange
que celle de gouvernante? Tout au plus pourrai-je hasarder, pour ne
point m'éloigner de la vraisemblance, que Mlle de Quinsonas devait
ressentir un apaisement dans ses sens, parce qu'elle était garantie
de la poursuite du marquis, dont je vous ai dit qu'elle avait eu
beaucoup à souffrir.
Mais il y a mille circonstances infimes qui prennent pour les
recluses une importance considérable.
Quand le marquis venait voir sa fille, par exemple, à des heures
réglementaires, je le veux bien, et qu'il s'asseyait en faisant tourner
sa canne entre ses doigts, ou bien en jouant, pour se donner
contenance, avec le bout de son nez rubicond, est-ce que vous
croyez qu'il échappait à Mlle de Quinsonas, que ce papa d'apparence
débonnaire, piquait, à la dérobée, ses formes plantureuses, d'un
désir aigu comme une alêne?
Notez qu'il y a quantité de menus faits que je ne puis relater et
qui se sont passés pendant que nous suivions le chevalier
Dieutegard: un esclandre entr'autres, causé par les deux perruches,
Mmes de la Vallée-Chourie et de la Vallée-Malitourne, que l'on a
surprises à l'entrée de l'hiver dans une attitude sur laquelle je me
garderai bien d'attirer votre attention.—Mon Dieu! que ces deux
sottes sont exaspérantes!—Si encore elles étaient jolies à tel point
que l'on pardonne tout! Mais, outre que leur grâce ne fut jamais
qu'ordinaire, je suis porté à croire que les amours déviées du droit
chemin n'embellissent pas. Certes, ce n'est pas moi qui regrette que
le bruit fait autour d'elles ne soit pas parvenu jusqu'à nous!
Mais il faudrait posséder l'âme chaste du bon abbé Pucelle ou la
crédule simplicité de Ninon pour goûter l'illusion que le mur élevé
entre le château et le gynécée est de taille à barrer la route au subtil
et malin fluide qu'est l'esprit du siècle. Telle la belle Zébute se
faufilait, en se faisant toute petite, par le trou de la chatière
ménagée dans la porte de chêne, tel le scandale, par les lèvres
candides de Marie Coquelière, pénétra, amenuisé, étiré en longueur,
dans la demeure des vierges, et s'y présenta sur ses quatre pieds,
noirci d'horreurs, et d'aspect satanique.
Je ne reconstituerai pas le récit de la nourrice, auquel nous avons
échappé et dont, aussi bien, nous n'avons que faire. Je n'y touche
en passant que pour vous apitoyer sur le cas de notre pauvre
gouvernante qui, étant de chair sensible, dut éprouver des
picotements cruels à l'audition de ces lascives historiettes, agrandies
une fois encore par une imagination solitaire.
Des relations de la grosse maman Châteaubedeau avec Chourie,
des relations de Châteaubedeau le fils avec la marquise, elle était
informée quotidiennement, mieux que par la gazette, vous n'en
doutez pas: de quoi donc eût parlé Marie Coquelière? De ce qui
advint à Dieutegard, vous savez qu'elles n'ont rien ignoré. Enfin, la
dernière nouvelle était que le marquis redevenait amoureux de sa
femme.
Ah! çà, n'allez pas croire cependant que la digne nourrice
racontait tout cela au plein air, et sans souci des oreilles de
Jacquette! Non. Elle excellait à employer un langage imagé qui
agrémentait d'un voile fleuri le sens dangereux de la vérité, et elle
savait aussi profiter des moments où la fillette était absorbée par
l'avidité des interrogations de Pomme d'Api.
D'ailleurs on couchait Jacquette de bonne heure, et, tout au bout
de l'immense pièce où flottaient encore les tentures à moulins
brodés de M. Lemeunier de Fontevrault, Marie Coquelière et la
gouvernante chuchotaient longuement, la porte entr'ouverte, un
léger courant d'air semblant agiter les ailes des moulins.
Enfin Mlle de Quinsonas fermait la porte, tirait le verrou et
s'avançait sur la pointe des pieds, afin de voir si Jacquette était
endormie. Et, quand elle s'en était assurée, elle poussait devant le
feu la bouillotte, afin de faire ses ablutions à l'eau chaude, car elle
était frileuse.
C'était une de ces grosses bonnes bouillottes ventripotentes,
goitreuses et cabossées par un long usage, vieilles servantes tassées
sur jambes, mais souriantes et honorées de servir, telles enfin que
l'on n'en voit plus aujourd'hui que tout devient mince, étriqué,
anguleux et chagrin. Et cette bouillote chantait délicieusement sur
les cendres. Mlle de Quinsonas en aimait la musique tour à tour
plaintive et ardente, mélancolique ainsi qu'une voix entendue le soir
dans la campagne, et gaillarde tout à coup, frétillante, rieuse, d'une
fantaisie sans cesse renouvelée; puis elle courait au secours de la
chanteuse suffoquée par un vomissement de glouglous qui lui
soulevaient le couvercle et inondaient le brasier parmi des nuages de
fumée.
Elle se déshabillait lentement devant les flammes d'un grand feu
de hêtre, dont les bûches énormes étaient elles-mêmes un
spectacle. A cette heure-là, la pièce était chaude, et il faisait bon
s'étirer les membres, une fois dévêtue, dans la pénombre à peine
violée de temps en temps par une grande flamme téméraire qui se
cassait rapidement le cou à vouloir s'élever trop haut.
Mlle de Quinsonas se mettait volontiers à cheval sur une chaise
qu'elle approchait du feu le plus possible; elle conservait alors ses
mules, pour s'accrocher par leurs talons à l'un des barreaux; et, les
yeux larges ouverts sur quelque point brillant, elle envoyait sa main
à la promenade, sur le devant des jambes et sur l'envers de ses
longues et belles cuisses qui rôtissaient agréablement.
Que lui disait le feu de bois, qui parle comme un ballet d'opéra,
comme un coucher de soleil? Seuls peuvent s'en douter ceux qui ont
rêvé, des soirées entières, à la campagne, devant ses inimitables
féeries. Et que lui disait la chanson de l'eau? Que lui disait l'ombre?
Que lui disait le silence? A parler franc, je crois que le cerveau de
Mlle de Quinsonas était trop strictement discipliné pour entendre, de
la part de la nature, quoi que ce fût qu'on ne lui eût appris à
entendre. Mais lorsqu'une personne a le cerveau si bien élevé et,
d'autre part, le corps mûr et parfaitement sain de Mlle de Quinsonas,
je me plais à croire qu'une entente secrète s'établit entre le
chuchotement innocent des choses créées par la main de Dieu, et
notre chair, leur sœur.
Donc, l'intelligence de Mlle de Quinsonas ne saisissait pas un
traître mot de ce langage, et cependant qui sait si la vie même de
Mlle de Quinsonas ne résultait pas de cet échange de vues, de ces
épanchements puérils entre son corps et l'eau et le feu et les milliers
d'éléments invisibles qui flottaient entre les moulins brodés des
anciennes tentures? La nature et notre chair réparent, à elles seules,
bien des désordres que l'esprit humain a introduits dans nos affaires.
Aussi je prie que l'on me permette de ne pas m'éloigner si tôt de
cette opération merveilleuse qui a lieu ce soir d'hiver devant le feu
du gynécée, au bénéfice d'une pauvre gouvernante privée des
expansions les plus légitimes, et que Dieu cependant avait formée,
assurément,—eu égard à sa belle santé et à sa plénitude,—pour
s'épanouir dans l'acte d'amour, comme tout ce qu'il se plaît à faire
sortir du néant.
Lorsque le chant de la bouillotte s'exalte, qu'une fièvre agite ses
flancs, et que l'on sent approcher le moment où un spasme violent
va projeter l'eau au dehors, Mlle de Quinsonas empoigne la queue
emmaillotée d'osier, et emplit à demi un bassin haut sur pieds qu'elle
enjambe prestement, car elle adore, avant de toucher l'eau, se sentir
embrassée par la vapeur brûlante. Tel est même parfois son bien-
être, qu'elle ne retient pas un cri suffisant à réveiller Jacquette; et
l'enfant, un œil entr'ouvert, assiste, au hasard de la complaisance
des flammes mourantes, au dialogue mystérieux de l'eau avec la
chair de sa gouvernante.
Mlle de Quinsonas semble chevaucher une nue, et je suis bien
certain que nombre de romanciers saisiraient l'occasion pour vous
dire que Jacquette croit voir en rêve Junon ou quelque déesse
académique reproduite par une gravure du temps. Mais point du
tout. Jacquette se moque bien de Junon! Jacquette se demande ce
qu'elle dira à Pomme d'Api, si Pomme d'Api, par hasard, désire savoir
pourquoi la gouvernante apporte à sa toilette du soir un temps et
une attention qu'on ne tolérerait pas aux enfants.
Mlle de Quinsonas reçoit de la vapeur de terribles caresses; le
nuage brutal la frappe, la meurtrit, la fait se soulever sur ses jambes
flexibles; puis rapidement il s'adoucit, devient câlin, flatteur,
l'embrasse à la fois de toutes parts d'une lèvre humide et douce,
commande à ses flocons de suivre étroitement les courbes du corps;
et ceux-ci, comme cent doigts avides, rôdent, glissent, frôlent, se
nichent, se blottissent, s'exténuent; et c'est cent, c'est mille amants
que cette fille refusée aux hommes reçoit ainsi des éléments, sans
provocation de sa part, croyez-moi:—elle n'eût pas inventé ces
attentats multiples;—sans responsabilité aussi, croyez-moi encore:—
elle se fût reproché comme un crime de ne les pas repousser.—Non,
non, cela se fait par une permission spéciale du Créateur, qui veille à
ce que l'humble matière participe au divin plaisir.

You might also like