[PATCH] Add @R parameter transform to reverse expansion order

Jackson Hansen <[email protected]> Wed, 29 Apr 2026 05:39:12 -0700
Newsgroups gmane.comp.shells.bash.bugs
Message-ID <[email protected]>
Implement the @R parameter transformation to reverse the order of
list-valued parameter expansions.

This applies to array and positional parameter expansions such as
${param[@]@R}, ${param[*]@R}, ${@@R}, and ${*@R}.

The transformation preserves existing quoting, joining, and word-splitting
semantics for each expansion form. Scalar parameter expansions are
unchanged.
---
 subst.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/subst.c b/subst.c
index dd5d57b..2532713 100644
--- a/subst.c
+++ b/subst.c
@@ -8771,6 +8771,9 @@ string_transform (int xc, SHELL_VAR *v, char *s)
       case 'Q':
 	ret = sh_quote_reusable (s, 0);
 	break;
+      case 'R':
+	ret = savestring (s);
+	break;
       case 'U':
 	ret = sh_modcase (s, 0, CASE_UPPER);
 	break;
@@ -8802,7 +8805,11 @@ list_transform (int xc, SHELL_VAR *v, WORD_LIST *list, int itype, int quoted)
       w->word = tword ? tword : savestring ("");	/* XXX */
       new = make_word_list (w, new);
     }
-  l = REVERSE_LIST (new, WORD_LIST *);
+
+  /* ${name[@]@R} and ${name[*]@R}: keep the list in the reverse
+     order produced by prepending above. Other transformations preserve
+     the original order by reversing NEW back. */
+  l = (xc == 'R') ? new : REVERSE_LIST (new, WORD_LIST *);
 
   qflags = quoted;
   /* If we are expanding in a context where word splitting will not be
@@ -8910,6 +8917,7 @@ valid_parameter_transform (const char *xform)
     case 'E':		/* expand like $'...' */
     case 'P':		/* expand like prompt string */
     case 'Q':		/* quote reusably */
+    case 'R':		/* reverse array or positional parameter order */
     case 'U':		/* transform to uppercase */
     case 'u':		/* transform by capitalizing */
     case 'L':		/* transform to lowercase */
-- 
2.53.0