1#! /bin/sh
2#
3# @(#)cmdsub.sh	1.8 20/06/21 Copyright 2016-2020 J. Schilling
4#
5
6# Read test core functions
7. ../../common/test-common
8
9docommand A1 "$SHELL cmdsub-A1" 0 "x\n" ""
10docommand A2 "$SHELL cmdsub-A2" 0 "x\n" ""
11docommand A3 "$SHELL cmdsub-A3" 0 "x\n" ""
12docommand A4 "$SHELL cmdsub-A4" 0 "x\n" ""
13docommand A5 "$SHELL cmdsub-A5" 0 "x\n" ""
14
15docommand B "$SHELL cmdsub-B" 0 "quoted )\n" ""
16
17docommand C "$SHELL cmdsub-C" 0 "comment\n" ""
18
19docommand D1 "$SHELL cmdsub-D1" 0 "here-doc with )\n" ""
20docommand D2 "$SHELL cmdsub-D2" 2 "" IGNORE
21docommand D3 "$SHELL cmdsub-D3" 0 "here-doc with \\()\n" ""
22
23docommand E "$SHELL cmdsub-E" 0 "here-doc terminated with a parenthesis\n" ""
24
25docommand F "$SHELL cmdsub-F" 0 "' # or a single back- or doublequote\n" ""
26
27docommand G "$SHELL cmdsub-G" 0 "\n" ""
28
29docommand H "$SHELL cmdsub-H" 0 "\n" ""
30
31#
32# This command substitution is used by Sven Maschek in "whatshell.sh"
33#
34if [ "$is_bosh" = true ]; then
35
36expect_fail_save=$expect_fail
37expect_fail=true
38docommand -silent -esilent cmdsub00 \
39  "$SHELL -c 'set -o | grep \"posix.*on\" > /dev/null && echo YES || echo NO'" \
40  0 "NO\n" ""
41expect_fail=$expect_fail_save
42if [ "$failed" = true ]; then
43	echo
44	echo "$SHELL is in POSIX mode, skipping test cmdsub01."
45	echo
46else
47	docommand cmdsub01 "$SHELL -c 'case \$( (:^times) 2>&1) in *0m*) echo OK;; *) echo FAIL;; esac'" 0 "OK\n" ""
48fi
49else
50	echo
51	echo "Not a Bourne Shell, skipping cmdsub01: ^ pipe test: \"(:^times)\""
52	echo
53fi
54
55#
56# Check whether $() allows to include complex strings that contain newlines
57#
58cat > x <<"XEOF"
59: ${AWK=/usr/bin/nawk}
60#$AWK 'BEGIN {print rand()}' < /dev/null > /dev/null 2> /dev/null || AWK=/usr/bin/nawk
61$AWK 'BEGIN {print rand()}' < /dev/null > /dev/null 2> /dev/null || AWK=/usr/bin/gawk
62$AWK 'BEGIN {print rand()}' < /dev/null > /dev/null 2> /dev/null || AWK=/usr/bin/awk
63$AWK 'BEGIN {print rand()}' < /dev/null > /dev/null 2> /dev/null || AWK=nawk
64$AWK 'BEGIN {print rand()}' < /dev/null > /dev/null 2> /dev/null || AWK=gawk
65$AWK 'BEGIN {print rand()}' < /dev/null > /dev/null 2> /dev/null || AWK=awk
66
67seed=
68rand() {
69  eval "$(
70    $AWK -v range="$1" '
71      BEGIN {
72        srand('"$seed"')
73        print "seed=" int(rand() * 2^31)
74        print "echo " int(rand() * range)
75      }')"
76}
77
78rand 100000000
79rand 100000000
80XEOF
81docommand cmdsub02 "$SHELL ./x" 0 IGNORE ""
82
83#
84# Check whether "didnl" in func.c is correctly reset.
85#
86docommand cmdsub03 "$SHELL -c 'echo \$( printf a; printf b )
87: \$(
88cat << HERE
89HERE
90)
91echo \$( printf a; printf b ) '" 0 "ab\nab\n" ""
92
93#
94# Check whether a redirected comand group { ...; } works.
95#
96docommand cmdsub04 "$SHELL -c 'var=\$({ echo value >&3; } 3>&1); echo \$var'" 0 "value\n" ""
97
98remove x
99success
100