diff options
Diffstat (limited to 'Src/subst.c')
-rw-r--r-- | Src/subst.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/Src/subst.c b/Src/subst.c index 1c2397c05..4df53bdb7 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -3475,7 +3475,6 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, if (nojoin == 0 || sep) { val = sepjoin(aval, sep, 1); isarr = 0; - ms_flags = 0; } else if (force_split && (spsep || nojoin == 2 || (!ifs && isarr < 0))) { /* Hack to simulate splitting individual elements: @@ -3485,6 +3484,8 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, val = sepjoin(aval, (nojoin == 1 ? NULL : spsep), 1); isarr = 0; } + if (!isarr) + ms_flags = 0; } if (force_split && !isarr) { aval = sepsplit(val, spsep, 0, 1); @@ -4007,6 +4008,18 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, y = dupstring(nulstring); setdata(n, (void *) y); } + if (isarr && ssub) { + /* prefork() wants a scalar, so join no matter what else */ + LinkNode tn; + + aval = hlinklist2array(l, 0); + val = sepjoin(aval, NULL, 1); + n = firstnode(l); + for (tn = lastnode(l); tn && tn != n; tn = lastnode(l)) + uremnode(l, tn); + setdata(n, (void *) val); + l->list.flags &= ~LF_ARRAY; + } if (eval) *str = (char *) getdata(n); |