Just now have been playing with a subshell in OpenBSD.
Three snippets from the
Command syntax section of
sh(1):
Quote:
......‘;;’ is used in case statements; and lastly, ‘( .. )’ is used to create subshells.
[snip]
Note: Some shells (but not this one) execute control structure commands in a subshell when one or more of their file descriptors are redirected, so any environment changes inside them may fail. To be portable, the exec statement should be used instead to redirect file descriptors before the control structure.
[snip]
( list )
Execute list in a subshell. There is no implicit way to pass environment changes from a subshell back to its parent.
|
For this post I am only interested in the first and last snippet ....
A small test shell script:
Code:
1 #!/bin/sh
2
3 echo setting 'a=1' ...
4 a=1
5
6 echo About to enter subshell ...
7 (
8
9 echo From within subshell the value of 'a' : $a
10
11 echo Assigning 2 to 'a' ...
12 a=2
13
14 echo From within subshell the value of 'a' : $a
15 cd /etc
16 echo Working directory changed to $(pwd)
17 echo Leaving subshell
18
19 ) # end of subshell
20
21 echo Back 'home' from trip to subshell ...
22 echo Value of 'a' : $a
23 echo Working directory: $(pwd)
Running it:
Code:
$ ./_subshell | cat -n
1 setting a=1 ...
2 About to enter subshell ...
3 From within subshell the value of a : 1
4 Assigning 2 to a ...
5 From within subshell the value of a : 2
6 Working directory changed to /etc
7 Leaving subshell
8 Back home from trip to subshell ...
9 Value of a : 1
10 Working directory: /home/adriaan/Customize/PARTS
The subshell inherits the variable 'a'. The subshell assignment of '2' is lost when we exit the subshell. Same for the working directory change to
/etc/.
So when I have copied
/dev/MAKEDEV to
/Template.mfs/dev I can start a subshell with
(. Then just change dir to
/Template.mfs/dev and do
# ./MAKEDEV all
and leave the subshell with
).
That means something like the following is not needed at all:
Code:
# --- run MAKEDEV in template directory
CURDIR=$(pwd)
cd $DESTDIR
echo Running $(basename $SOURCE) in $(pwd) ...
echo ./MAKEDEV all
cd ${CURDIR}
An alternative could be
# sh -c 'cd /Template.mfs/dev ; ./MAKEDEV all'
, which is all right for simple one-liner commands. For multiple commands a subshell looks attractive.
For some feedback how this script behaves in other shells like FreeBSD's
/bin/sh, or
bash on *BSD or Linux, I have attached the script.
Please test and let me know