Je Sat, Jan 25, 2025 at 07:16:14AM +0000, Ross skribis: > > Configuration Information [Automatically generated, do not change]: > Machine: x86_64 > OS: linux-gnu > Compiler: gcc > Compilation CFLAGS: -g -O2 -fno-omit-frame-pointer -mno-omit-leaf- > frame-pointer -flto=auto -ffat-lto-objects -fstack-protector-strong - > fstack-clash-protection -Wformat -Werror=format-security -fcf- > protection -Wall > uname output: Linux X220-Bravo 6.8.0-51-generic #52-Ubuntu SMP > PREEMPT_DYNAMIC Thu Dec 5 13:09:44 UTC 2024 x86_64 x86_64 x86_64 > GNU/Linux > Machine Type: x86_64-pc-linux-gnu > > Bash Version: 5.2 > Patch Level: 21 > Release Status: release > > Description: > >From the command line > printf "%*s\n" 80 " " | tr " " "*" > does just what I'd expect generating a banner line of asterisks. > > However: > foo=$(printf "%*s\n" 80 " " | tr " " "*") > echo $foo > acts very differently; it seems to perform ls or something similar. > > The same occurs with the more standard printf "%80s" form. > > Repeat-By: > As above. > > Fix: > Unknown. >
This is no bug in bash but in your shell code. There is almost never a reason *not* to double quote a variable substitution. Doing so will prevent the shell from splitting the value of the variable on the characters in $IFS (space, tab, and newline, by default), but also from using the split-up value as filename globbing patterns, which is what happens in your case. Just double quote the variable expansion: echo "$foo" -- Andreas (Kusalananda) Kähäri Uppsala, Sweden .