Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Advanced Bash Shell Scripting Gude.pdf
Скачиваний:
57
Добавлен:
17.08.2013
Размер:
4.82 Mб
Скачать

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]