Home Page Icon
Home Page
Table of Contents for
Cover
Close
Cover
by Cameron Newham, JP Vossen, Carl Albing
bash Cookbook
bash Cookbook
A Note Regarding Supplemental Files
Preface
Who Should Read This Book
About This Book
GNU Software
A Note About Code Examples
Useless Use of cat
A Note About Perl
More Resources
Conventions Used in This Book
Using Code Examples
We’d Like to Hear from You
Safari® Enabled
Acknowledgments
Reviewers
O’Reilly
From the Authors
Carl
JP
Cameron
1. Beginning bash
0. Why bash?
0. The bash Shell
1.1. Decoding the Prompt
1.1.1. Problem
1.1.2. Solution
1.1.3. Discussion
1.1.4. See Also
1.2. Showing Where You Are
1.2.1. Problem
1.2.2. Solution
1.2.3. Discussion
1.2.4. See Also
1.3. Finding and Running Commands
1.3.1. Problem
1.3.2. Solution
1.3.3. Discussion
1.3.4. See Also
1.4. Getting Information About Files
1.4.1. Problem
1.4.2. Solution
1.4.3. Discussion
1.4.4. See Also
1.5. Showing All Hidden (dot) Files in the Current Directory
1.5.1. Problem
1.5.2. Solution
1.5.3. Discussion
1.5.4. See Also
1.6. Using Shell Quoting
1.6.1. Problem
1.6.2. Solution
1.6.3. Discussion
1.6.4. See Also
1.7. Using or Replacing Built-ins and External Commands
1.7.1. Problem
1.7.2. Solution
1.7.3. Discussion
1.7.4. See Also
1.8. Determining If You Are Running Interactively
1.8.1. Problem
1.8.2. Solution
1.8.3. Discussion
1.8.4. See Also
1.9. Setting bash As Your Default Shell
1.9.1. Problem
1.9.2. Solution
1.9.3. Discussion
1.9.4. See Also
1.10. Getting bash for Linux
1.10.1. Problem
1.10.2. Solution
1.10.3. Discussion
1.10.4. See Also
1.11. Getting bash for xBSD
1.11.1. Problem
1.11.2. Solution
1.11.3. Discussion
1.11.4. See Also
1.12. Getting bash for Mac OS X
1.12.1. Problem
1.12.2. Solution
1.12.3. Discussion
1.12.4. See Also
1.13. Getting bash for Unix
1.13.1. Problem
1.13.2. Solution
1.13.3. Discussion
1.13.4. See Also
1.14. Getting bash for Windows
1.14.1. Problem
1.14.2. Solution
1.14.3. Discussion
1.14.4. See Also
1.15. Getting bash Without Getting bash
1.15.1. Problem
1.15.2. Solution
1.15.3. Discussion
1.15.4. See Also
1.16. Learning More About bash Documentation
1.16.1. Problem
1.16.2. Solution
1.16.2.1. Official documentation
1.16.2.2. Other documentation
1.16.3. See Also
2. Standard Output
2.1. Writing Output to the Terminal/Window
2.1.1. Problem
2.1.2. Solution
2.1.3. Discussion
2.1.4. See Also
2.2. Writing Output but Preserving Spacing
2.2.1. Problem
2.2.2. Solution
2.2.3. Discussion
2.2.4. See Also
2.3. Writing Output with More Formatting Control
2.3.1. Problem
2.3.2. Solution
2.3.3. Discussion
2.3.4. See Also
2.4. Writing Output Without the Newline
2.4.1. Problem
2.4.2. Solution
2.4.3. Discussion
2.4.4. See Also
2.5. Saving Output from a Command
2.5.1. Problem
2.5.2. Solution
2.5.3. Discussion
2.5.4. See Also
2.6. Saving Output to Other Files
2.6.1. Problem
2.6.2. Solution
2.6.3. Discussion
2.6.4. See Also
2.7. Saving Output from the ls Command
2.7.1. Problem
2.7.2. Solution
2.7.3. Discussion
2.7.4. See Also
2.8. Sending Both Output and Error Messages to Different Files
2.8.1. Problem
2.8.2. Solution
2.8.3. Discussion
2.8.4. See Also
2.9. Sending Both Output and Error Messages to the Same File
2.9.1. Problem
2.9.2. Solution
2.9.3. Discussion
2.9.4. See Also
2.10. Appending Rather Than Clobbering Output
2.10.1. Problem
2.10.2. Solution
2.10.3. Discussion
2.10.4. See Also
2.11. Using Just the Beginning or End of a File
2.11.1. Problem
2.11.2. Solution
2.11.3. Discussion
2.11.4. See Also
2.12. Skipping a Header in a File
2.12.1. Problem
2.12.2. Solution
2.12.3. Discussion
2.12.4. See Also
2.13. Throwing Output Away
2.13.1. Problem
2.13.2. Solution
2.13.3. Discussion
2.13.4. See Also
2.14. Saving or Grouping Output from Several Commands
2.14.1. Problem
2.14.2. Solution
2.14.3. Discussion
2.14.4. See Also
2.15. Connecting Two Programs by Using Output As Input
2.15.1. Problem
2.15.2. Solution
2.15.3. Discussion
2.15.4. See Also
2.16. Saving a Copy of Output Even While Using It As Input
2.16.1. Problem
2.16.2. Solution
2.16.3. Discussion
2.16.4. See Also
2.17. Connecting Two Programs by Using Output As Arguments
2.17.1. Problem
2.17.2. Solution
2.17.3. Discussion
2.17.4. See Also
2.18. Using Multiple Redirects on One Line
2.18.1. Problem
2.18.2. Solution
2.18.3. Discussion
2.18.4. See Also
2.19. Saving Output When Redirect Doesn’t Seem to Work
2.19.1. Problem
2.19.2. Solution
2.19.3. Discussion
2.19.4. See Also
2.20. Swapping STDERR and STDOUT
2.20.1. Problem
2.20.2. Solution
2.20.3. Discussion
2.20.4. See Also
2.21. Keeping Files Safe from Accidental Overwriting
2.21.1. Problem
2.21.2. Solution
2.21.3. Discussion
2.21.4. See Also
2.22. Clobbering a File on Purpose
2.22.1. Problem
2.22.2. Solution
2.22.3. Discussion
2.22.4. See Also
3. Standard Input
3.1. Getting Input from a File
3.1.1. Problem
3.1.2. Solution
3.1.3. Discussion
3.1.4. See Also
3.2. Keeping Your Data with Your Script
3.2.1. Problem
3.2.2. Solution
3.2.3. Discussion
3.2.4. See Also
3.3. Preventing Weird Behavior in a Here-Document
3.3.1. Problem
3.3.2. Solution
3.3.3. Discussion
3.3.4. See Also
3.4. Indenting Here-Documents
3.4.1. Problem
3.4.2. Solution
3.4.3. Discussion
3.4.4. See Also
3.5. Getting User Input
3.5.1. Problem
3.5.2. Solution
3.5.3. Discussion
3.5.4. See Also
3.6. Getting Yes or No Input
3.6.1. Problem
3.6.2. Solution
3.6.3. Discussion
3.6.4. See Also
3.7. Selecting from a List of Options
3.7.1. Problem
3.7.2. Solution
3.7.3. Discussion
3.7.4. See Also
3.8. Prompting for a Password
3.8.1. Problem
3.8.2. Solution
3.8.3. Discussion
3.8.4. See Also
4. Executing Commands
4.1. Running Any Executable
4.1.1. Problem
4.1.2. Solution
4.1.3. Discussion
4.1.4. See Also
4.2. Telling If a Command Succeeded or Not
4.2.1. Problem
4.2.2. Solution
4.2.3. Discussion
4.2.4. See Also
4.3. Running Several Commands in Sequence
4.3.1. Problem
4.3.2. Solution
4.3.3. Discussion
4.4. Running Several Commands All at Once
4.4.1. Problem
4.4.2. Solution
4.4.3. Discussion
4.4.4. See Also
4.5. Deciding Whether a Command Succeeds
4.5.1. Problem
4.5.2. Solution
4.5.3. Discussion
4.5.4. See Also
4.6. Using Fewer if Statements
4.6.1. Problem
4.6.2. Solution
4.6.3. Discussion
4.6.4. See Also
4.7. Running Long Jobs Unattended
4.7.1. Problem
4.7.2. Solution
4.7.3. Discussion
4.7.4. See Also
4.8. Displaying Error Messages When Failures Occur
4.8.1. Problem
4.8.2. Solution
4.8.3. Discussion
4.8.4. See Also
4.9. Running Commands from a Variable
4.9.1. Problem
4.9.2. Solution
4.9.3. Discussion
4.9.4. See Also
4.10. Running All Scripts in a Directory
4.10.1. Problem
4.10.2. Solution
4.10.3. Discussion
4.10.4. See Also
5. Basic Scripting: Shell Variables
5.1. Documenting Your Script
5.1.1. Problem
5.1.2. Solution
5.1.3. Discussion
5.1.4. See Also
5.2. Embedding Documentation in Shell Scripts
5.2.1. Problem
5.2.2. Solution
5.2.3. Discussion
5.2.4. See Also
5.3. Promoting Script Readability
5.3.1. Problem
5.2.2. Solution
5.3.3. Discussion
5.3.4. See Also
5.4. Separating Variable Names from Surrounding Text
5.4.1. Problem
5.4.2. Solution
5.4.3. Discussion
5.4.4. See Also
5.5. Exporting Variables
5.5.1. Problem
5.5.2. Solution
5.5.3. Discussion
5.5.4. See Also
5.6. Seeing All Variable Values
5.6.1. Problem
5.6.2. Solution
5.6.3. Discussion
5.6.4. See Also
5.7. Using Parameters in a Shell Script
5.7.1. Problem
5.7.2. Solution
5.7.3. Discussion
5.7.4. See Also
5.8. Looping Over Arguments Passed to a Script
5.8.1. Problem
5.8.2. Solution
5.8.3. Discussion
5.8.4. See Also
5.9. Handling Parameters with Blanks
5.9.1. Problem
5.9.2. Solution
5.9.3. Discussion
5.9.4. See Also
5.10. Handling Lists of Parameters with Blanks
5.10.1. Problem
5.10.2. Solution
5.10.3. Discussion
5.10.4. See Also
5.11. Counting Arguments
5.11.1. Problem
5.11.2. Solution
5.11.3. Discussion
5.11.4. See Also
5.12. Consuming Arguments
5.12.1. Problem
5.12.2. Solution
5.12.3. Discussion
5.12.4. See Also
5.13. Getting Default Values
5.13.1. Problem
5.13.2. Solution
5.13.3. Discussion
5.13.4. See Also
5.14. Setting Default Values
5.14.1. Problem
5.14.2. Solution
5.14.3. Discussion
5.14.4. See Also
5.15. Using null As a Valid Default Value
5.15.1. Problem
5.15.2. Solution
5.15.3. Discussion
5.15.4. See Also
5.16. Using More Than Just a Constant String for Default
5.16.1. Problem
5.16.2. Solution
5.16.3. Discussion
5.16.4. See Also
5.17. Giving an Error Message for Unset Parameters
5.17.1. Problem
5.17.2. Solution
5.17.3. Discussion
5.17.4. See Also
5.18. Changing Pieces of a String
5.18.1. Problem
5.18.2. Solution
5.18.3. Discussion
5.18.4. See Also
5.19. Using Array Variables
5.19.1. Problem
5.19.2. Solution
5.19.3. Description
5.19.4. See Also
6. Shell Logic and Arithmetic
6.1. Doing Arithmetic in Your Shell Script
6.1.1. Problem
6.1.2. Solution
6.1.3. Discussion
6.1.4. See Also
6.2. Branching on Conditions
6.2.1. Problem
6.2.2. Solution
6.2.3. Discussion
6.2.4. See Also
6.3. Testing for File Characteristics
6.3.1. Problem
6.3.2. Solution
6.3.3. Discussion
6.3.4. See Also
6.4. Testing for More Than One Thing
6.4.1. Problem
6.4.2. Solution
6.4.3. Discussion
6.4.4. See Also
6.5. Testing for String Characteristics
6.5.1. Problem
6.5.2. Solution
6.5.3. Discussion
6.5.4. See Also
6.6. Testing for Equal
6.6.1. Problem
6.6.2. Solution
6.6.3. Discussion
6.6.4. See Also
6.7. Testing with Pattern Matches
6.7.1. Problem
6.7.2. Solution
6.7.3. Discussion
6.7.4. See Also
6.8. Testing with Regular Expressions
6.8.1. Problem
6.8.2. Solution
6.8.3. Discussion
6.8.4. See Also
6.9. Changing Behavior with Redirections
6.9.1. Problem
6.9.2. Solution
6.9.3. Discussion
6.9.4. See Also
6.10. Looping for a While
6.10.1. Problem
6.10.2. Solution
6.10.3. Discussion
6.10.4. See Also
6.11. Looping with a read
6.11.1. Problem
6.11.2. Solution
6.11.3. Discussion
6.11.4. See Also
6.12. Looping with a Count
6.12.1. Problem
6.12.2. Solution
6.12.3. Discussion
6.12.4. See Also
6.13. Looping with Floating-Point Values
6.13.1. Problem
6.13.2. Solution
6.13.3. Discussion
6.13.4. See Also
6.14. Branching Many Ways
6.14.1. Problem
6.14.2. Solution
6.14.3. Discussion
6.14.4. See Also
6.15. Parsing Command-Line Arguments
6.15.1. Problem
6.15.2. Solution
6.15.3. Discussion
6.15.4. See Also
6.16. Creating Simple Menus
6.16.1. Problem
6.16.2. Solution
6.16.3. Discussion
6.16.4. See Also
6.17. Changing the Prompt on Simple Menus
6.17.1. Problem
6.17.2. Solution
6.17.3. Discussion
6.17.4. See Also
6.18. Creating a Simple RPN Calculator
6.18.1. Problem
6.18.2. Solution
6.18.3. Discussion
6.18.4. See Also
6.19. Creating a Command-Line Calculator
6.19.1. Problem
6.19.2. Solution
6.19.3. Discussion
6.19.4. See Also
7. Intermediate Shell Tools I
7.1. Sifting Through Files for a String
7.1.1. Problem
7.1.2. Solution
7.1.3. Discussion
7.1.4. See Also
7.2. Getting Just the Filename from a Search
7.2.1. Problem
7.2.2. Solution
7.2.3. Discussion
7.2.4. See Also
7.3. Getting a Simple True/False from a Search
7.3.1. Problem
7.3.2. Solution
7.3.3. Discussion
7.3.4. See Also
7.4. Searching for Text While Ignoring Case
7.4.1. Problem
7.4.2. Solution
7.4.3. Discussion
7.4.4. See Also
7.5. Doing a Search in a Pipeline
7.5.1. Problem
7.5.2. Solution
7.5.3. Discussion
7.5.4. See Also
7.6. Paring Down What the Search Finds
7.6.1. Problem
7.6.2. Solution
7.6.3. Discussion
7.6.4. See Also
7.7. Searching with More Complex Patterns
7.8. Searching for an SSN
7.8.1. Problem
7.8.2. Solution
7.8.3. Discussion
7.8.4. See Also
7.9. Grepping Compressed Files
7.9.1. Problem
7.9.2. Solution
7.9.3. Discussion
7.9.4. See Also
7.10. Keeping Some Output, Discarding the Rest
7.10.1. Problem
7.10.2. Solution
7.10.3. Discussion
7.10.4. See Also
7.11. Keeping Only a Portion of a Line of Output
7.11.1. Problem
7.11.2. Solution
7.11.3. Discussion
7.11.4. See Also
7.12. Reversing the Words on Each Line
7.12.1. problem
7.12.2. Solution
7.12.3. Discussion
7.12.4. See Also
7.13. Summing a List of Numbers
7.13.1. Problem
7.13.2. Solution
7.13.3. Discussion
7.13.4. See Also
7.14. Counting String Values
7.14.1. Problem
7.14.2. Solution
7.14.3. Discussion
7.14.4. See Also
7.15. Showing Data As a Quick and Easy Histogram
7.15.1. Problem
7.15.2. Solution
7.15.3. Discussion
7.15.4. See Also
7.16. Showing a Paragraph of Text After a Found Phrase
7.16.1. Problem
7.16.2. Solution
7.16.3. Discussion
7.16.4. See Also
8. Intermediate Shell Tools II
8.1. Sorting Your Output
8.1.1. Problem
8.1.2. Solution
8.1.3. Discussion
8.1.4. See Also
8.2. Sorting Numbers
8.2.1. Problem
8.2.2. Solution
8.2.3. Discussion
8.2.4. See Also
8.3. Sorting IP Addresses
8.3.1. Problem
8.3.2. Solution
8.3.3. Discussion
8.3.4. See Also
8.4. Cutting Out Parts of Your Output
8.4.1. Problem
8.4.2. Solution
8.4.3. Discussion
8.4.4. See Also
8.5. Removing Duplicate Lines
8.5.1. Problem
8.5.2. Solution
8.5.3. Discussion
8.5.4. See Also
8.6. Compressing Files
8.6.1. Problem
8.6.2. Solution
8.6.3. Discussion
8.6.4. See Also
8.7. Uncompressing Files
8.7.1. Problem
8.7.2. Solution
8.7.3. Discussion
8.7.4. See Also
8.8. Checking a tar Archive for Unique Directories
8.8.1. Problem
8.8.2. Solution
8.8.3. Discussion
8.8.4. See Also
8.9. Translating Characters
8.9.1. Problem
8.9.2. Solution
8.9.3. Discussion
8.9.4. See Also
8.10. Converting Uppercase to Lowercase
8.10.1. Problem
8.10.2. Solution
8.10.3. Discussion
8.10.4. See Also
8.11. Converting DOS Files to Linux Format
8.11.1. Problem
8.11.2. Solution
8.11.3. Discussion
8.11.4. See Also
8.12. Removing Smart Quotes
8.12.1. Problem
8.12.2. Solution
8.12.3. Discussion
8.12.4. See Also
8.13. Counting Lines, Words, or Characters in a File
8.13.1. Problem
8.13.2. Solution
8.13.3. Discussion
8.13.4. See Also
8.14. Rewrapping Paragraphs
8.14.1. Problem
8.14.2. Solution
8.14.3. Discussion
8.14.4. See Also
8.15. Doing More with less
8.15.1. Problem
8.15.2. Solution
8.15.3. Discussion
8.15.4. See Also
9. Finding Files: find, locate, slocate
9.1. Finding All Your MP3 Files
9.1.1. Problem
9.1.2. Solution
9.1.3. Discussion
9.1.4. See Also
9.2. Handling Filenames Containing Odd Characters
9.2.1. Problem
9.2.2. Solution
9.2.3. Discussion
9.2.4. See Also
9.3. Speeding Up Operations on Found Files
9.3.1. Problem
9.3.2. Solution
9.3.3. See Also
9.4. Finding Files Across Symbolic Links
9.4.1. Problem
9.4.2. Solution
9.4.3. Discussion
9.4.4. See Also
9.5. Finding Files Irrespective of Case
9.5.1. Problem
9.5.2. Solution
9.5.3. Discussion
9.5.4. See Also
9.6. Finding Files by Date
9.6.1. Problem
9.6.2. Solution
9.6.3. Discussion
9.6.4. See Also
9.7. Finding Files by Type
9.7.1. Problem
9.7.2. Solution
9.7.3. Discussion
9.7.4. See Also
9.8. Finding Files by Size
9.8.1. Problem
9.8.2. Solution
9.8.3. Discussion
9.8.4. See Also
9.9. Finding Files by Content
9.9.1. Problem
9.9.2. Solution
9.9.3. Discussion
9.9.4. See Also
9.10. Finding Existing Files and Content Fast
9.10.1. Problem
9.10.2. Solution
9.10.3. Discussion
9.10.4. See Also
9.11. Finding a File Using a List of Possible Locations
9.11.1. Problem
9.11.2. Solution
9.11.3. Discussion
9.11.4. See Also
10. Additional Features for Scripting
10.1. “Daemon-izing” Your Script
10.1.1. Problem
10.1.2. Solution
10.1.3. Discussion
10.1.4. See Also
10.2. Reusing Code with Includes and Sourcing
10.2.1. Problem
10.2.2. Solution
10.2.3. Discussion
10.2.4. See Also
10.3. Using Configuration Files in a Script
10.3.1. Problem
10.3.2. Solution
10.3.3. Discussion
10.3.4. See Also
10.4. Defining Functions
10.4.1. Problem
10.4.2. Solution
10.4.3. Discussion
10.4.4. See Also
10.5. Using Functions: Parameters and Return Values
10.5.1. Problem
10.5.2. Solution
10.5.3. Discussion
10.5.4. See Also
10.6. Trapping Interrupts
10.6.1. Problem
10.6.2. Solution
10.6.3. Discussion
10.6.4. See Also
10.7. Redefining Commands with alias
10.7.1. Problem
10.7.2. Solution
10.7.3. Discussion
10.7.4. See Also
10.8. Avoiding Aliases, Functions
10.8.1. Problem
10.8.2. Solution
10.8.3. Discussion
10.8.4. See Also
11. Working with Dates and Times
11.1. Formatting Dates for Display
11.1.1. Problem
11.1.2. Solution
11.1.3. Discussion
11.1.4. See Also
11.2. Supplying a Default Date
11.2.1. Problem
11.2.2. Solution
11.2.3. Discussion
11.2.4. See Also
11.3. Automating Date Ranges
11.3.1. Problem
11.3.2. Solution
11.3.3. Discussion
11.3.4. See Also
11.4. Converting Dates and Times to Epoch Seconds
11.4.1. Problem
11.4.2. Solution
11.4.3. Discussion
11.4.4. See Also
11.5. Converting Epoch Seconds to Dates and Times
11.5.1. Problem
11.5.2. Solution
11.5.3. Discussion
11.5.4. See Also
11.6. Getting Yesterday or Tomorrow with Perl
11.6.1. Problem
11.6.2. Solution
11.6.3. Discussion
11.6.4. See Also
11.7. Figuring Out Date and Time Arithmetic
11.7.1. Problem
11.7.2. Solution
11.7.3. Discussion
11.7.4. See Also
11.8. Handling Time Zones, Daylight Saving Time, and Leap Years
11.8.1. Problem
11.8.2. Solution
11.8.3. See Also
11.9. Using date and cron to Run a Script on the Nth Day
11.9.1. Problem
11.9.2. Solution
11.9.3. Discussion
11.9.4. See Also
12. End-User Tasks As Shell Scripts
12.1. Starting Simple by Printing Dashes
12.1.1. Problem
12.1.2. Solution
12.1.3. Discussion
12.1.4. See Also
12.2. Viewing Photos in an Album
12.2.1. Problem
12.2.2. Solution
12.2.3. Discussion
12.2.4. See Also
12.3. Loading Your MP3 Player
12.3.1. Problem
12.3.2. Solution
12.3.3. Discussion
12.3.4. See Also
12.4. Burning a CD
12.4.1. Problem
12.4.2. Solution
12.4.3. Discussion
12.4.4. See Also
12.5. Comparing Two Documents
12.5.1. Problem
12.5.2. Solution
12.5.3. Discussion
12.5.4. See Also
13. Parsing and Similar Tasks
13.1. Parsing Arguments for Your Shell Script
13.1.1. Problem
13.1.2. Solution
13.1.3. Discussion
13.1.4. See Also
13.2. Parsing Arguments with Your Own Error Messages
13.2.1. Problem
13.2.2. Solution
13.2.3. Discussion
13.2.4. See Also
13.3. Parsing Some HTML
13.3.1. Problem
13.3.2. Solution
13.3.3. Discussion
13.3.4. See Also
13.4. Parsing Output into an Array
13.4.1. Problem
13.4.2. Solution
13.4.3. Discussion
13.4.4. See Also
13.5. Parsing Output with a Function Call
13.5.1. Problem
13.5.2. Solution
13.5.3. Discussion
13.5.4. See Also
13.6. Parsing Text with a read Statement
13.6.1. Problem
13.6.2. Solution
13.6.3. Discussion
13.6.4. See Also
13.7. Parsing with read into an Array
13.7.1. Problem
13.7.2. Solution
13.7.3. Discussion
13.7.4. See Also
13.8. Getting Your Plurals Right
13.8.1. Problem
13.8.2. Solution
13.8.3. Discussion
13.8.4. See Also
13.9. Taking It One Character at a Time
13.9.1. Problem
13.9.2. Solution
13.9.3. Discussion
13.9.4. See Also
13.10. Cleaning Up an SVN Source Tree
13.10.1. Problem
13.10.2. Solution
13.10.3. Discussion
13.10.4. See Also
13.11. Setting Up a Database with MySQL
13.11.1. Problem
13.11.2. Solution
13.11.3. Discussion
13.11.4. See Also
13.12. Isolating Specific Fields in Data
13.12.1. Problem
13.12.2. Solution
13.12.3. Discussion
13.12.4. See Also
13.13. Updating Specific Fields in Data Files
13.13.1. Problem
13.13.2. Solution
13.3. Discussion
13.13.4. See Also
13.14. Trimming Whitespace
13.14.1. Problem
13.14.2. Solution
13.14.3. Discussion
13.14.4. See Also
13.15. Compressing Whitespace
13.15.1. Problem
13.15.2. Solution
13.15.3. Discussion
13.15.4. See Also
13.16. Processing Fixed-Length Records
13.16.1. Problem
13.16.2. Solution
13.16.3. Discussion
13.16.4. See Also
13.17. Processing Files with No Line Breaks
13.17.1. Problem
13.17.2. Solution
13.17.3. Discussion
13.17.4. See Also
13.18. Converting a Data File to CSV
13.18.1. Problem
13.18.2. Solution
13.18.3. Discussion
13.18.4. See Also
13.19. Parsing a CSV Data File
13.19.1. Problem
13.19.2. Solution
13.19.3. Discussion
13.19.4. See Also
14. Writing Secure Shell Scripts
14.1. Avoiding Common Security Problems
14.1.1. Problem
14.1.2. Solution
14.1.3. Discussion
14.1.4. See Also
14.2. Avoiding Interpreter Spoofing
14.2.1. Problem
14.2.2. Solution
14.2.3. Discussion
14.2.4. See Also
14.3. Setting a Secure $PATH
14.3.1. Problem
14.3.2. Solution
14.3.3. Discussion
14.3.4. See Also
14.4. Clearing All Aliases
14.4.1. Problem
14.4.2. Solution
14.4.3. Discussion
14.4.4. See Also
14.5. Clearing the Command Hash
14.5.1. Problem
14.5.2. Solution
14.5.3. Discussion
14.5.4. See Also
14.6. Preventing Core Dumps
14.6.1. Problem
14.6.2. Solution
14.6.3. Discussion
14.6.4. See Also
14.7. Setting a Secure $IFS
14.7.1. Problem
14.7.2. Solution
14.7.3. Discussion
14.7.4. See Also
14.8. Setting a Secure umask
14.8.1. Problem
14.8.2. Solution
14.8.3. Discussion
14.8.4. See Also
14.9. Finding World-Writable Directories in Your $PATH
14.9.1. Problem
14.9.2. Solution
14.9.3. Discussion
14.9.4. See Also
14.10. Adding the Current Directory to the $PATH
14.10.1. Problem
14.10.2. Solution
14.10.3. Discussion
14.10.4. See Also
14.11. Using Secure Temporary Files
14.11.1. Problem
14.11.2. Solution
14.11.3. Discussion
14.11.4. See Also
14.12. Validating Input
14.12.1. Problem
14.12.2. Solution
14.12.3. Discussion
14.12.4. See Also
14.13. Setting Permissions
14.13.1. Problem
14.13.2. Solution
14.13.3. Discussion
14.13.4. See Also
14.14. Leaking Passwords into the Process List
14.14.1. Problem
14.14.2. Solution
14.14.3. Discussion
14.14.4. See Also
14.15. Writing setuid or setgid Scripts
14.15.1. Problem
14.15.2. Solution
14.15.3. Discussion
14.15.4. See Also
14.16. Restricting Guest Users
14.16.1. Problem
14.16.2. Solution
14.16.3. Discussion
14.16.4. See Also
14.17. Using chroot Jails
14.17.1. Problem
14.17.2. Solution
14.17.3. Discussion
14.17.4. See Also
14.18. Running As a Non-root User
14.18.1. Problem
14.18.2. Solution
14.18.3. Discussion
14.18.4. See Also
14.19. Using sudo More Securely
14.19.1. Problem
14.19.2. Solution
14.19.3. Discussion
14.19.4. See Also
14.20. Using Passwords in Scripts
14.20.1. Problem
14.20.2. Solution
14.20.3. Discussion
14.20.4. See Also
14.21. Using SSH Without a Password
14.21.1. Problem
14.21.2. Solution
14.21.3. Discussion
14.21.4. See Also
14.22. Restricting SSH Commands
14.22.1. Problem
14.22.2. Solution
14.22.3. Discussion
14.22.4. See Also
14.23. Disconnecting Inactive Sessions
14.23.1. Problem
14.23.2. Solution
14.23.3. Discussion
14.23.4. See Also
15. Advanced Scripting
15.1. Finding bash Portably for #!
15.1.1. Problem
15.1.2. Solution
15.1.3. Discussion
15.1.4. See Also
15.2. Setting a POSIX $PATH
15.2.1. Problem
15.2.2. Solution
15.2.3. Discussion
15.2.4. See Also
15.3. Developing Portable Shell Scripts
15.3.1. Problem
15.3.2. Solution
15.3.3. Discussion
15.3.4. See Also
15.4. Testing Scripts in VMware
15.4.1. Problem
15.4.2. Solution
15.4.3. Discussion
15.4.4. See Also
15.5. Using for Loops Portably
15.5.1. Problem
15.5.2. Solution
15.5.3. Discussion
15.5.4. See Also
15.6. Using echo Portably
15.6.1. Problem
15.6.2. Solution
15.6.3. Discussion
15.6.4. See Also
15.7. Splitting Output Only When Necessary
15.7.1. Problem
15.7.2. Solution
15.7.3. Discussion
15.7.4. See Also
15.8. Viewing Output in Hex
15.8.1. Problem
15.8.2. Solution
15.8.3. Discussion
15.8.4. See Also
15.9. Using bash Net-Redirection
15.9.1. Problem
15.9.2. Solution
15.9.3. Discussion
15.9.4. See Also
15.10. Finding My IP Address
15.10.1. Problem
15.10.2. Solution
15.10.3. Discussion
15.10.4. See Also
15.11. Getting Input from Another Machine
15.11.1. Problem
15.11.2. Solution
15.11.3. Discussion
15.11.4. See Also
15.12. Redirecting Output for the Life of a Script
15.12.1. Problem
15.12.2. Solution
15.12.3. Discussion
15.12.4. See Also
15.13. Working Around “argument list too long” Errors
15.13.1. Problem
15.13.2. Solution
15.13.3. Discussion
15.13.4. See Also
15.14. Logging to syslog from Your Script
15.14.1. Problem
15.14.2. Solution
15.14.3. Discussion
15.14.4. See Also
15.15. Sending Email from Your Script
15.15.1. Problem
15.15.2. Solution
15.15.3. Discussion
15.15.4. See Also
15.16. Automating a Process Using Phases
15.16.1. Problem
15.16.2. Solution
15.16.3. Discussion
15.16.4. See Also
16. Configuring and Customizing bash
16.1. bash Startup Options
16.1.1. Problem
16.1.2. Solution
16.1.3. Discussion
16.1.4. See Also
16.2. Customizing Your Prompt
16.2.1. Problem
16.2.2. Solution
16.2.2.1. Basic prompts
16.2.2.2. Fancy prompts
16.2.3. Discussion
16.2.3.1. Colors
16.2.4. See Also
16.3. Change Your $PATH Permanently
16.3.1. Problem
16.3.2. Solution
16.3.3. Discussion
16.3.4. See Also
16.4. Change Your $PATH Temporarily
16.4.1. Problem
16.4.2. Solution
16.4.3. Discussion
16.4.4. See Also
16.5. Setting Your $CDPATH
16.5.1. Problem
16.5.2. Solution
16.5.3. Discussion
16.5.4. See Also
16.6. Shortening or Changing Command Names
16.6.1. Problem
16.6.2. Solution
16.6.3. Discussion
16.6.4. See Also
16.7. Adjusting Shell Behavior and Environment
16.7.1. Problem
16.7.2. Solution
16.7.3. Discussion
16.7.4. See Also
16.8. Adjusting readline Behavior Using .inputrc
16.8.1. Problem
16.8.2. Solution
16.8.3. Discussion
16.8.4. See Also
16.9. Keeping a Private Stash of Utilities by Adding ~/bin
16.9.1. Problem
16.9.2. Solution
16.9.3. Discussion
16.9.4. See Also
16.10. Using Secondary Prompts: $PS2, $PS3, $PS4
16.10.1. Problem
16.10.2. Solution
16.10.3. Discussion
16.10.4. See Also
16.11. Synchronizing Shell History Between Sessions
16.11.1. Problem
16.11.2. Solution
16.11.3. Discussion
16.11.4. See Also
16.12. Setting Shell History Options
16.12.1. Problem
16.12.2. Solution
16.12.3. Discussion
16.12.4. See Also
13. Creating a Better cd Command
16.13.1. Problem
16.13.2. Solution
16.13.3. Discussion
16.13.4. See Also
16.14. Creating and Changing into a New Directory in One Step
16.14.1. Problem
16.14.2. Solution
16.14.3. Discussion
16.14.4. See Also
16.15. Getting to the Bottom of Things
16.15.1. Problem
16.15.2. Solution
16.15.3. Discussion
16.15.4. See Also
16.16. Adding New Features to bash Using Loadable Built-ins
16.16.1. Problem
16.16.2. Solution
16.16.3. Discussion
16.16.4. See Also
16.17. Improving Programmable Completion
16.17.1. Problem
16.17.2. Solution
16.17.3. Discussion
16.17.4. See Also
16.18. Using Initialization Files Correctly
16.18.1. Problem
16.18.2. Solution
16.18.3. Discussion
16.18.4. See Also
16.19. Creating Self-Contained, Portable RC Files
16.19.1. Problem
16.19.2. Solution
16.19.3. Discussion
16.19.3.1. Assumptions
16.19.3.2. Criteria
16.19.4. See Also
16.20. Getting Started with a Custom Configuration
16.20.1. Problem
16.20.2. Solution
16.20.3. Discussion
16.20.4. See Also
17. Housekeeping and Administrative Tasks
17.1. Renaming Many Files
17.1.1. Problem
17.1.2. Solution
17.1.3. Discussion
17.1.4. See Also
17.2. Using GNU Texinfo and Info on Linux
17.2.1. Problem
17.2.2. Solution
17.2.3. Discussion
17.2.4. See Also
17.3. Unzipping Many ZIP Files
17.3.1. Problem
17.3.2. Solution
17.3.3. Discussion
17.3.4. See Also
17.4. Recovering Disconnected Sessions Using screen
17.4.1. Problem
17.4.2. Solution
17.4.3. Discussion
17.4.3.1. Caveats
17.4.3.2. Configuration
17.4.4. See Also
17.5. Sharing a Single bash Session
17.5.1. Problem
17.5.2. Solution
17.5.3. Discussion
17.5.4. See Also
17.6. Logging an Entire Session or Batch Job
17.6.1. Problem
17.6.2. Solution
17.6.3. Discussion
17.6.4. See Also
17.7. Clearing the Screen When You Log Out
17.7.1. Problem
17.7.2. Solution
17.7.3. Discussion
17.7.4. See Also
17.8. Capturing File Metadata for Recovery
17.8.1. Problem
17.8.2. Solution
17.8.3. Discussion
17.8.4. See Also
17.9. Creating an Index of Many Files
17.9.1. Problem
17.9.2. Solution
17.9.3. Discussion
17.9.4. See Also
17.10. Using diff and patch
17.10.1. Problem
17.10.2. Solution
17.10.3. Discussion
17.10.4. See Also
17.11. Counting Differences in Files
17.11.1. Problem
17.11.2. Solution
17.11.3. Discussion
17.11.4. See Also
17.12. Removing or Renaming Files Named with Special Characters
17.12.1. Problem
17.12.2. Solution
17.12.3. Discussion
17.12.4. See Also
17.13. Prepending Data to a File
17.13.1. Problem
17.13.2. Solution
17.13.3. Discussion
17.13.4. See Also
17.14. Editing a File in Place
17.14.1. Problem
17.14.2. Solution
17.14.3. Discussion
17.14.4. See Also
17.15. Using sudo on a Group of Commands
17.15.1. Problem
17.15.2. Solution
17.15.3. Discussion
17.15.4. See Also
17.16. Finding Lines in One File But Not in the Other
17.16.1. Problem
17.16.2. Solution
17.16.3. Discussion
17.16.4. See Also
17.17. Keeping the Most Recent N Objects
17.17.1. Problem
17.17.2. Solution
17.17.3. Discussion
17.17.4. See Also
17.18. Grepping ps Output Without Also Getting the grep Process Itself
17.18.1. Problem
17.18.2. Solution
17.18.3. Discussion
17.18.4. See Also
17.19. Finding Out Whether a Process Is Running
17.19.1. Problem
17.19.2. Solution
17.19.3. Discussion
17.19.4. See Also
17.20. Adding a Prefix or Suffix to Output
17.20.1. Problem
17.20.2. Solution
17.20.3. Discussion
17.20.4. See Also
17.21. Numbering Lines
17.21.1. Problem
17.21.2. Solution
17.21.3. Discussion
17.21.4. See Also
17.22. Writing Sequences
17.22.1. Problem
17.22.2. Solution
17.22.3. Discussion
17.22.4. See Also
17.23. Emulating the DOS Pause Command
17.23.1. Problem
17.23.2. Solution
17.23.3. Discussion
17.23.4. See Also
17.24. Commifying Numbers
17.24.1. Problem
17.24.2. Solution
17.24.3. Discussion
17.24.4. See Also
18. Working Faster by Typing Less
18.1. Moving Quickly Among Arbitrary Directories
18.1.1. Problem
18.1.2. Solution
18.1.3. Discussion
18.1.4. See Also
18.2. Repeating the Last Command
18.2.1. Problem
18.2.2. Solution
18.2.3. Description
18.2.4. See Also
18.3. Running Almost the Same Command
18.3.1. Problem
18.3.2. Solution
18.3.3. Discussion
18.3.4. See Also
18.4. Quick Substitution
18.4.1. Problem
18.4.2. Solution
18.4.3. Discussion
18.4.4. See Also
18.5. Reusing Arguments
18.5.1. Problem
18.5.2. Solution
18.5.3. Discussion
18.5.4. See Also
18.6. Finishing Names for You
18.6.1. Problem
18.6.2. Solution
18.6.3. Discussion
18.6.4. See Also
18.7. Playing It Safe
18.7.1. Problem
18.7.2. Solution
18.7.3. Discussion
18.7.4. See Also
19. Tips and Traps: Common Goofs for Novices
19.1. Forgetting to Set Execute Permissions
19.1.1. Problem
19.1.2. Solution
19.1.3. Discussion
19.1.4. See Also
19.2. Fixing “No such file or directory” Errors
19.2.1. Problem
19.2.2. Solution
19.2.3. Discussion
19.2.4. See Also
19.3. Forgetting That the Current Directory Is Not in the $PATH
19.3.1. Problem
19.3.2. Solution
19.3.3. Discussion
19.3.4. See Also
19.4. Naming Your Script Test
19.4.1. Problem
19.4.2. Solution
19.4.3. Discussion
19.4.4. See Also
19.5. Expecting to Change Exported Variables
19.5.1. Problem
19.5.2. Solution
19.5.3. Discussion
19.5.4. See Also
19.6. Forgetting Quotes Leads to “command not found” on Assignments
19.6.1. Problem
19.6.2. Solution
19.6.3. Discussion
19.6.4. See Also
19.7. Forgetting That Pattern Matching Alphabetizes
19.8. Forgetting That Pipelines Make Subshells
19.8.1. Problem
19.8.2. Solution
19.8.3. Discussion
19.8.4. See Also
19.9. Making Your Terminal Sane Again
19.9.1. Problem
19.9.2. Solution
19.9.3. Discussion
19.9.4. See Also
19.10. Deleting Files Using an Empty Variable
19.10.1. Problem
19.10.2. Solution
19.10.3. Discussion
19.10.4. See Also
19.11. Seeing Odd Behavior from printf
19.11.1. Problem
19.11.2. Solution
19.11.3. Discussion
19.11.4. See Also
19.12. Testing bash Script Syntax
19.12.1. Problem
19.12.2. Solution
19.12.3. Discussion
19.12.4. See Also
19.13. Debugging Scripts
19.13.1. Problem
19.13.2. Solution
19.13.3. Discussion
19.13.4. See Also
19.14. Avoiding “command not found” When Using Functions
19.14.1. Problem
19.14.2. Solution
19.14.3. Discussion
19.14.4. See Also
19.15. Confusing Shell Wildcards and Regular Expressions
19.15.1. Problem
19.15.2. Solution
19.15.3. Discussion
19.15.4. See Also
A. Reference Lists
A.1. bash Invocation
A.2. Prompt String Customizations
A.3. ANSI Color Escape Sequences
A.4. Built-in Commands and Reserved Words
A.5. Built-in Shell Variables
A.6. set Options
A.7. shopt options
A.8. Adjusting Shell Behavior Using set, shopt, and Environment Variables
A.9. Test Operators
A.10. I/O Redirection
A.11. echo Options and Escape Sequences
A.12. printf
A.12.1. Examples
A.12.2. See Also
A.13. Date and Time String Formatting with strftime
A.14. Pattern-Matching Characters
A.15. extglob Extended Pattern-Matching Operators
A.16. tr Escape Sequences
A.17. Readline Init File Syntax
A.18. emacs Mode Commands
A.19. vi Control Mode Commands
A.20. Table of ASCII Values
B. Examples Included with bash
B.1. Startup-Files Directory Examples
C. Command-Line Processing
C.1. Command-Line Processing Steps
C.1.1. Quoting
C.1.2. eval
D. Revision Control
D.1. CVS
D.1.1. Pros
D.1.2. Cons
D.1.3. Example
D.1.4. See Also
D.2. Subversion
D.2.1. Pros
D.2.2. Cons
D.2.3. Example
D.2.4. See Also
D.3. RCS
D.3.1. Pros
D.3.2. Cons
D.3.3. Example
D.3.4. Workon Script
D.3.5. See Also
D.4. Other
D.4.1. Document Comparison
D.4.2. Change Tracking and Versions
D.4.3. Accessing These Features
E. Building bash from Source
E.1. Obtaining bash
E.2. Unpacking the Archive
E.3. What’s in the Archive
E.3.1. Documentation
E.3.2. Configuring and Building bash
E.3.3. Testing bash
E.3.4. Potential Problems
E.3.5. Installing bash as a Login Shell
E.3.6. Examples
E.4. Who Do I Turn To?
E.4.1. Asking Questions
E.4.2. Reporting Bugs
Index
About the Authors
Colophon
Copyright
Search in book...
Toggle Font Controls
Playlists
Add To
Create new playlist
Name your new playlist
Playlist description (optional)
Cancel
Create playlist
Sign In
Email address
Password
Forgot Password?
Create account
Login
or
Continue with Facebook
Continue with Google
Sign Up
Full Name
Email address
Confirm Email Address
Password
Login
Create account
or
Continue with Facebook
Continue with Google
Next
Next Chapter
bash Cookbook
Add Highlight
No Comment
..................Content has been hidden....................
You can't read the all page of ebook, please click
here
login for view all page.
Day Mode
Cloud Mode
Night Mode
Reset