|
|||
Subshell
Just now have been playing with a subshell in OpenBSD.
Three snippets from the Command syntax section ofsh(1): Quote:
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) 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 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} # 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
__________________
You don't need to be a genius to debug a pf.conf firewall ruleset, you just need the guts to run tcpdump |
|
||||
Quote:
Code:
% sh --version GNU bash, version 4.2.53(2)-release (i486-slackware-linux-gnu) ... % . subshell.sh setting a=1 ... About to enter subshell ... From within subshell the value of a : 1 Assigning 2 to a ... From within subshell the value of a : 2 Working directory changed to /etc Leaving subshell Back home from trip to subshell ... Value of a : 1 Working directory: /not/etc I wanted to add two other points. 1) In this thread we discovered that sometimes subshells are used in implementing loops. So they may occur in "hidden" ways from which environment variables unexpectedly can not be passed out. 2) Once after running into that trouble, I realized a possible work-around. Instead of using an environment variable, which can't be passed out of the subshell, one could try to use the exit status of the subshell to pass information out. For example, you could bit-map (or otherwise encode) the information to be passed out into the exit status. Code:
( # shell does stuff here, and sets STATUS variable exit $STATUS ) case $? in 0) ... ;; 1) ... ;; etc... esac |
|
|||
Thank you
__________________
You don't need to be a genius to debug a pf.conf firewall ruleset, you just need the guts to run tcpdump |
Tags |
sub-shell, subshell |
|
|