ash: add process substitution in bash-compatibility mode
Process substitution is a Korn shell feature that's also available
in bash and some other shells.  This patch implements process
substitution in ash when ASH_BASH_COMPAT is enabled.
function                                             old     new   delta
argstr                                              1386    1522    +136
strtodest                                              -      52     +52
readtoken1                                          3346    3392     +46
.rodata                                           183206  183250     +44
unwindredir                                            -      28     +28
cmdloop                                              365     372      +7
static.spclchars                                      10      12      +2
cmdputs                                              380     367     -13
exitreset                                             86      69     -17
evalcommand                                         1754    1737     -17
varvalue                                             675     634     -41
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 5/4 up/down: 315/-88)           Total: 227 bytes
   text	   data	    bss	    dec	    hex	filename
 953967	   4219	   1904	 960090	  ea65a	busybox_old
 954192	   4219	   1904	 960315	  ea73b	busybox_unstripped
v2: Replace array of file descriptors with a linked list.
    Include tests that were unaccountably omitted from v1.
v3: Update linked list code to the intended version.
v4: Change order of conditional code in cmdputs().
v5: Use existing popredir() mechanism to manage file descriptors.
v6: Rebase to latest version of BusyBox ash.  Reduce code churn.
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
			
			
This commit is contained in:
		
				
					committed by
					
						
						Denys Vlasenko
					
				
			
			
				
	
			
			
			
						parent
						
							8c1f8aa016
						
					
				
				
					commit
					a1b0d3856d
				
			
							
								
								
									
										33
									
								
								shell/ash_test/ash-psubst/bash_procsub.tests
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										33
									
								
								shell/ash_test/ash-psubst/bash_procsub.tests
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
# simplest case
 | 
			
		||||
cat <(echo "hello 1")
 | 
			
		||||
 | 
			
		||||
# can have more than one
 | 
			
		||||
cat <(echo "hello 2") <(echo "hello 3")
 | 
			
		||||
 | 
			
		||||
# doesn't work in quotes
 | 
			
		||||
echo "<(echo \"hello 0\")"
 | 
			
		||||
 | 
			
		||||
# process substitution can be nested inside command substitution
 | 
			
		||||
echo $(cat <(echo "hello 4"))
 | 
			
		||||
 | 
			
		||||
# example from http://wiki.bash-hackers.org/syntax/expansion/proc_subst
 | 
			
		||||
# process substitutions can be passed to a function as parameters or
 | 
			
		||||
# variables
 | 
			
		||||
f() {
 | 
			
		||||
	cat "$1" >"$x"
 | 
			
		||||
}
 | 
			
		||||
x=>(tr '[:lower:]' '[:upper:]') f <(echo 'hi there')
 | 
			
		||||
 | 
			
		||||
# process substitution can be combined with redirection on exec
 | 
			
		||||
rm -f err
 | 
			
		||||
# save stderr
 | 
			
		||||
exec 4>&2
 | 
			
		||||
# copy stderr to a file
 | 
			
		||||
exec 2> >(tee err)
 | 
			
		||||
echo "hello error" >&2
 | 
			
		||||
sync
 | 
			
		||||
# restore stderr
 | 
			
		||||
exec 2>&4
 | 
			
		||||
cat err
 | 
			
		||||
rm -f err
 | 
			
		||||
echo "hello stderr" >&2
 | 
			
		||||
		Reference in New Issue
	
	Block a user