- •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
Subshells
Advanced Bash-Scripting Guide:
Prev |
Next |
Chapter 20. Subshells
Running a shell script launches another instance of the command processor. Just as your commands are interpreted at the command line prompt, similarly does a script batch process a list of commands in a file. Each shell script running is, in effect, a subprocess of the parent shell, the one that gives you the prompt at the console or in an xterm window.
A shell script can also launch subprocesses. These subshells let the script do parallel processing, in effect executing multiple subtasks simultaneously.
Command List in Parentheses
( command1; command2; command3; ... )
A command list embedded between parentheses runs as a subshell.
Variables in a subshell are not visible outside the block of code in the subshell. They are not accessible to the parent process, to the shell that launched the subshell. These are, in effect, local variables.
Example 20-1. Variable scope in a subshell
#!/bin/bash
# subshell.sh
echo
outer_variable=Outer
(
inner_variable=Inner
echo "From subshell, \"inner_variable\" = $inner_variable" echo "From subshell, \"outer\" = $outer_variable"
)
echo
if [ -z "$inner_variable" ] then
echo "inner_variable undefined in main body of shell" else
echo "inner_variable defined in main body of shell"
fi
echo "From main body of shell, \"inner_variable\" = $inner_variable"
#$inner_variable will show as uninitialized because
#variables defined in a subshell are "local variables".
http://tldp.org/LDP/abs/html/subshells.html (1 of 4) [7/15/2002 6:34:23 PM]
Subshells
echo
exit 0
See also Example 32-1.
+
Directory changes made in a subshell do not carry over to the parent shell.
Example 20-2. List User Profiles
#!/bin/bash
#allprofs.sh: print all user profiles
#This script written by Heiner Steven, and modified by the document author.
FILE=.bashrc # |
File containing user profile, |
||
#+ |
was ".profile" in original script. |
||
for home in `awk |
-F: '{print |
$6}' |
/etc/passwd` |
do |
|
|
|
[ -d "$home" ] |
|| continue |
# |
If no home directory, go to next. |
[ -r "$home" ] |
|| continue |
# |
If not readable, go to next. |
(cd $home; [ -e $FILE ] && |
less |
$FILE) |
|
done |
|
|
|
# When script terminates, there is no need to 'cd' back to original directory, #+ because 'cd $home' takes place in a subshell.
exit 0
A subshell may be used to set up a "dedicated environment" for a command group.
COMMAND1
COMMAND2
COMMAND3
(
IFS=:
PATH=/bin unset TERMINFO set -C
shift 5 COMMAND4 COMMAND5
exit 3 # Only exits the subshell.
)
# The parent shell has not been affected, and the environment is preserved.
http://tldp.org/LDP/abs/html/subshells.html (2 of 4) [7/15/2002 6:34:23 PM]
Subshells
COMMAND6
COMMAND7
One application of this is testing whether a variable is defined.
if (set -u; : $variable) 2> /dev/null then
echo "Variable is set."
fi |
|
|
|
|
|
|
# Could also be written [[ |
${variable-x} != |
x || |
${variable-y} != y ]] |
|||
# |
or |
[[ |
${variable-x} |
!= |
x$variable ]] |
|
# |
or |
[[ |
${variable+x} |
= x ]]) |
|
Another application is checking for a lock file:
if (set -C; : > lock_file) 2> /dev/null then
echo "Another user is already running that script." exit 65
fi
# Thanks, S.C.
Processes may execute in parallel within different subshells. This permits breaking a complex task into subcomponents processed concurrently.
Example 20-3. Running parallel processes in subshells
(cat list1 list2 list3 | sort | uniq > list123) & (cat list4 list5 list6 | sort | uniq > list456) &
#Merges and sorts both sets of lists simultaneously.
#Running in background ensures parallel execution.
#Same effect as
#cat list1 list2 list3 | sort | uniq > list123 &
#cat list4 list5 list6 | sort | uniq > list456 &
wait |
# Don't execute the next command until subshells finish. |
diff list123 list456
Redirecting I/O to a subshell uses the "|" pipe operator, as in ls -al | (command).
A command block between curly braces does not launch a subshell.
{ command1; command2; command3; ... }
Prev |
Home |
Next |
http://tldp.org/LDP/abs/html/subshells.html (3 of 4) [7/15/2002 6:34:23 PM]
Subshells
Globbing |
Up |
Restricted Shells |
http://tldp.org/LDP/abs/html/subshells.html (4 of 4) [7/15/2002 6:34:23 PM]
A Sed and Awk Micro-Primer
|
Advanced Bash-Scripting Guide: |
Prev |
Next |
Appendix B. A Sed and Awk Micro-
Primer
Table of Contents
B.1. Sed
B.2. Awk
This is a very brief introduction to the sed and awk text processing utilities. We will deal with only a few basic commands here, but that will suffice for understanding simple sed and awk constructs within shell scripts.
sed: a non-interactive text file editor
awk: a field-oriented pattern processing language with a C-like syntax
For all their differences, the two utilities share a similar invocation syntax, both use regular expressions , both read input by default from stdin, and both output to stdout. These are well-behaved UNIX tools, and they work together well. The output from one can be piped into the other, and their combined capabilities give shell scripts some of the power of Perl.
One important difference between the utilities is that while shell scripts can easily pass arguments to sed, it is more complicated for awk (see Example 34-3 and Example 9-20).
Prev |
Home |
Next |
Contributed Scripts |
|
Sed |
http://tldp.org/LDP/abs/html/sedawk.html [7/15/2002 6:34:24 PM]