- •Advanced Bash-Scripting Guide
- •Dedication
- •Table of Contents
- •Part 1. Introduction
- •Advanced Bash-Scripting Guide
- •Chapter 2. Starting Off With a Sha-Bang
- •2.1. Invoking the script
- •2.2. Preliminary Exercises
- •Part 2. Basics
- •Chapter 3. Exit and Exit Status
- •Chapter 4. Special Characters
- •Chapter 5. Introduction to Variables and Parameters
- •5.1. Variable Substitution
- •5.2. Variable Assignment
- •5.3. Bash Variables Are Untyped
- •5.4. Special Variable Types
- •Chapter 6. Quoting
- •Chapter 7. Tests
- •7.1. Test Constructs
- •7.2. File test operators
- •7.3. Comparison operators (binary)
- •7.4. Nested if/then Condition Tests
- •7.5. Testing Your Knowledge of Tests
- •8.1. Operators
- •8.2. Numerical Constants
- •Part 3. Beyond the Basics
- •Chapter 9. Variables Revisited
- •9.1. Internal Variables
- •9.2. Manipulating Strings
- •9.3. Parameter Substitution
- •9.4. Typing variables: declare or typeset
- •9.5. Indirect References to Variables
- •9.6. $RANDOM: generate random integer
- •9.7. The Double Parentheses Construct
- •Chapter 10. Loops and Branches
- •10.1. Loops
- •10.2. Nested Loops
- •10.3. Loop Control
- •10.4. Testing and Branching
- •Chapter 11. Internal Commands and Builtins
- •12.1. Basic Commands
- •12.2. Complex Commands
- •12.3. Time / Date Commands
- •12.4. Text Processing Commands
- •12.5. File and Archiving Commands
- •12.6. Communications Commands
- •12.7. Terminal Control Commands
- •12.8. Math Commands
- •12.9. Miscellaneous Commands
- •Chapter 13. System and Administrative Commands
- •Chapter 14. Command Substitution
- •Chapter 15. Arithmetic Expansion
- •Chapter 16. I/O Redirection
- •16.1. Using exec
- •16.2. Redirecting Code Blocks
- •16.3. Applications
- •Chapter 17. Here Documents
- •Chapter 18. Recess Time
- •Part 4. Advanced Topics
- •Chapter 19. Regular Expressions
- •19.1. A Brief Introduction to Regular Expressions
- •19.2. Globbing
- •Chapter 20. Subshells
- •Chapter 21. Restricted Shells
- •Chapter 22. Process Substitution
- •Chapter 23. Functions
- •23.1. Complex Functions and Function Complexities
- •23.2. Local Variables
- •Chapter 24. Aliases
- •Chapter 25. List Constructs
- •Chapter 26. Arrays
- •Chapter 27. Files
- •Chapter 28. /dev and /proc
- •28.2. /proc
- •Chapter 29. Of Zeros and Nulls
- •Chapter 30. Debugging
- •Chapter 31. Options
- •Chapter 32. Gotchas
- •Chapter 33. Scripting With Style
- •Chapter 34. Miscellany
- •34.2. Shell Wrappers
- •34.3. Tests and Comparisons: Alternatives
- •34.4. Optimizations
- •34.5. Assorted Tips
- •34.6. Oddities
- •34.7. Security Issues
- •34.8. Portability Issues
- •34.9. Shell Scripting Under Windows
- •Chapter 35. Bash, version 2
- •36. Endnotes
- •36.1. Author's Note
- •36.2. About the Author
- •36.3. Tools Used to Produce This Book
- •36.4. Credits
- •List of Tables
- •List of Examples
- •Bibliography
Using exec
|
Advanced Bash-Scripting Guide: |
|
Prev |
Chapter 16. I/O Redirection |
Next |
16.1. Using exec
An exec <filename command redirects stdin to a file. From that point on, all stdin comes from that file, rather than its normal source (usually keyboard input). This provides a method of reading a file line by line and possibly parsing each line of input using sed and/or awk.
Example 16-1. Redirecting stdin using exec
#!/bin/bash
# Redirecting stdin using 'exec'.
exec 6<&0 |
# Link file descriptor #6 with stdin. |
|
|
|
# Saves stdin. |
exec < data-file |
# stdin replaced by file "data-file" |
|
read |
a1 |
# Reads first line of file "data-file". |
read |
a2 |
# Reads second line of file "data-file." |
echo
echo "Following lines read from file."
echo "------------------------------- |
" |
echo $a1 |
|
echo $a2 |
|
echo; echo; echo |
|
exec 0<&6 6<&-
#Now restore stdin from fd #6, where it had been saved,
#+ and close fd #6 ( 6<&- ) to free it for other processes to use.
# |
|
# <&6 6<&- |
also works. |
echo -n "Enter data " |
read b1 # Now "read" |
functions as expected, reading from normal stdin. |
echo "Input read from |
stdin." |
echo "---------------------- |
" |
echo "b1 = $b1" |
|
echo |
|
http://tldp.org/LDP/abs/html/x11344.html (1 of 4) [7/15/2002 6:34:18 PM]
Using exec
exit 0
Similarly, an exec >filename command redirects stdout to a designated file. This sends all command output that would normally go to stdout to that file.
Example 16-2. Redirecting stdout using exec
#!/bin/bash
# reassign-stdout.sh
LOGFILE=logfile.txt
exec 6>&1 |
# Link file descriptor #6 with stdout. |
|
|
# |
Saves stdout. |
exec > $LOGFILE |
# |
stdout replaced with file "logfile.txt". |
# ----------------------------------------------------------- |
|
# |
# All output from commands in this block sent to file $LOGFILE.
echo -n "Logfile: " |
|
date |
|
echo "------------------------------------- |
" |
echo |
|
echo "Output of \"ls -al\" command" |
|
echo |
|
ls -al |
|
echo; echo |
|
echo "Output of \"df\" command" |
|
echo |
|
df |
|
# ----------------------------------------------------------- |
# |
exec 1>&6 6>&- # Restore stdout and close file descriptor #6.
echo
echo "== stdout now restored to default == " echo
ls -al echo
exit 0
http://tldp.org/LDP/abs/html/x11344.html (2 of 4) [7/15/2002 6:34:18 PM]
Using exec
Example 16-3. Redirecting both stdin and stdout in the same script with exec
#!/bin/bash
#upperconv.sh
#Converts a specified input file to uppercase.
E_FILE_ACCESS=70
E_WRONG_ARGS=71
if [ ! |
-r "$1" ] |
# Is specified input file readable? |
|
then |
|
|
|
echo |
"Can't read from input file!" |
||
echo |
"Usage: $0 input-file |
output-file" |
|
exit |
$E_FILE_ACCESS |
|
|
fi |
|
# Will |
exit with same error |
|
|
#+ even |
if input file ($1) not specified. |
if [ -z "$2" ] then
echo "Need to specify output file." echo "Usage: $0 input-file output-file" exit $E_WRONG_ARGS
fi |
|
|
exec 4<&0 |
|
|
exec < $1 |
# Will read from input |
file. |
exec 7>&1 |
|
|
exec > $2 |
# Will write to output |
file. |
#Assumes output file writable (add check?).
#-----------------------------------------------
|
cat - |
| tr a-z A-Z |
# Uppercase conversion. |
# |
^^^^^ |
|
# Reads from stdin. |
# |
|
^^^^^^^^^^ |
# Writes to stdout. |
#However, both stdin and stdout were redirected.
#-----------------------------------------------
exec |
1>&7 |
7>&- |
# |
Restore |
stout. |
exec |
0<&4 |
4<&- |
# |
Restore |
stdin. |
# After restoration, the following line prints to stdout as expected. echo "File \"$1\" written to \"$2\" as uppercase conversion."
exit 0
http://tldp.org/LDP/abs/html/x11344.html (3 of 4) [7/15/2002 6:34:18 PM]
Using exec
Prev |
Home |
Next |
I/O Redirection |
Up |
Redirecting Code Blocks |
http://tldp.org/LDP/abs/html/x11344.html (4 of 4) [7/15/2002 6:34:18 PM]