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
9
shell/ash_test/ash-psubst/bash_procsub.right
Normal file
9
shell/ash_test/ash-psubst/bash_procsub.right
Normal file
@ -0,0 +1,9 @@
|
||||
hello 1
|
||||
hello 2
|
||||
hello 3
|
||||
<(echo "hello 0")
|
||||
hello 4
|
||||
HI THERE
|
||||
hello error
|
||||
hello error
|
||||
hello stderr
|
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