1

I was using printf to format a number in bash:

$ printf -- ">>%4d\n" 1
>>   1

This works fine, but when i do the same thing in a subshell:

$ echo $(printf -- ">>%4d\n" 1)
>> 1

Why are the spaces removed? I have absolutely no idea.

Charles Duffy
  • 280,126
  • 43
  • 390
  • 441
Sam De Meyer
  • 2,031
  • 1
  • 25
  • 32

3 Answers3

3

The sub-shell isn't doing it. Not directly.

The issue here is that you aren't quoting the sub-shell result. As such the shell is word-splitting the resulting text (which drops extraneous spaces) and then hands a list of words to echo which happily spits them back out at you (without the extra spaces).

This is essentially no different than running echo 1 and wondering where the extra spaces went.

My answer here discusses this a bit as well.

Community
  • 1
  • 1
Etan Reisner
  • 77,877
  • 8
  • 106
  • 148
  • Thx, i did echo "$(printf -- ">>%4d\n" 1)", and it works as expected now. Thanks for your quick and clear answer. I will mark the question as solved – Sam De Meyer Sep 08 '14 at 20:00
2

Make sure to use quotes while using command substitution to get spacing right:

echo "$(printf -- ">>%4d\n" 1)"
>>   1
anubhava
  • 761,203
  • 64
  • 569
  • 643
0

Below is the link which gives a detailed description when and why one should quote in their scripts, take a look it will be useful.

http://mywiki.wooledge.org/Quotes

Ram
  • 1,115
  • 8
  • 20