On Fri, Apr 09, 2021 at 05:57:10PM -0700, Junio C Hamano wrote: > Junio C Hamano <gitster@xxxxxxxxx> writes: > > >> + # start with a newline, to match hanging newline from open-quote style > >> + eval "$1=\$LF" > >> + local test_line > >> + while IFS= read -r test_line > >> + do > >> + eval "$1=\${$1}\${test_line}\${LF}" > >> + done > > > > I wonder if we can do this without relying on "read -r" (which I > > distrust, perhaps out of superstition)? Perhaps by slurping the > > whole thing with "$(cat)"? > > Meaning, something along this line... > > ----- >8 --------- >8 --------- >8 --------- >8 ---- > #!/bin/sh > LF=' > ' > ttt () { > eval "$1"='$LF$(cat)' > } > ttt script <<\EOT > a > b > EOT > echo "<<<$script>>>" > ----- 8< --------- 8< --------- 8< --------- 8< ---- I wrote it using cat initially. If you want to preserve trailing whitespace, you have to do something like: val=$(printf '\n' cat printf '.') val=${val%.} I was worried about adding the overhead of the extra subshell and process for the command substitution, but perhaps that is overblown. TBH, worrying about whitespace may be overblown, too. Some test snippets have extra blank lines at the end, but possibly we should just not care. I imagine "read -r" does not work reliably for binary junk, but keep in mind that we are talking about text shell script snippets (that are already in shell strings anyway). -Peff