On Wed, Oct 08, 2025 at 03:52:24 -0400, Craig H Maynard wrote:
> In my Bash scripts, I indent using spaces instead of tabs but I'd still like 
> to get this behavior. Why not strip leading whitespace?

Because that's not how it's defined to work.

https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_07_04

    If the redirection operator is "<<-", all leading <tab> characters
    shall be stripped from input lines after <backslash><newline> line
    continuation (when it applies) has been performed, and from the
    line containing the trailing delimiter. Stripping of leading <tab>
    characters shall occur as the here-document is read from the shell
    input (and consequently does not affect any <tab> characters that
    result from expansions).

If you want rationale, consider this: how would you perform the
equivalent of the following under your proposed change?

        cat <<-'EOF'
        usage: myprogram [-q] [-f file]
        
            Options:
              -q       Quiet mode (suppress progress messages)
              -f file  Read from file instead of standard input
        EOF

I.e. each line is indented with one tab, which is intended to be
removed.  Some lines have spaces after the tab, and those spaces
are intended to be preserved.

To get the equivalent of your proposed change without modifying the
shell in a way that would violate the definitions, you could replace
cat with sed:

        sed 's/^[[:space:]]*//' <<-'EOF'
        These lines
        are indented
        with spaces
EOF

The only eyesore would be the delimiter word, which can't be indented
with spaces.

Reply via email to