IFS not fixing carriage returns

Tim McDaniel tmcd@panix.com
Fri Mar 25 21:31:00 GMT 2011


I have tried Googling for info on this, but there are a lot of false
hits ...

I want to run bash scripts on a Cygwin-running system.  The problem is
that (so far as I know) I cannot control the format of the scripts --
Rational Build Forge writes each line of the script with a trailing
carriage return and then invokes the script with the environment that
it wants to put out there.

Although it's not documented in "man bash" on the latest Cygwin, I did
find "set -o igncr" and it seems to work well.

But I'm just curious about why my first attempt didn't work.  This is
a test script with CR-LF lines that I ran on my own box.

     #! /bin/bash --
     set -x                      #
     echo "$IFS" | od -t x1 -a   #
     IFS="$IFS"$'\r'             #
     echo "$IFS" | od -t x1 -a   #
     # set -o igncr 2>/dev/null || true
     #

     echo "Hello, world!"
     pwd
     ls -l | head
     exit 0

The trailing #s are to prevent problems with carriage returns before I
can do something about them.

But the output is

$ ./128.bash
     + echo '
     '
     + od -t x1 -a
     0000000  20  09  0a  0a
              sp  ht  nl  nl
     0000004
     + IFS='
     '
     + echo '
     '
     + od -t x1 -a
     0000000  20  09  0a  0d  0a
              sp  ht  nl  cr  nl
     0000005
     + $'\r'
     ./128.bash: line 8: $'\r': command not found
     ' echo 'Hello, world!
     Hello, world!
     + $'pwd\r'
     ./128.bash: line 10: $'pwd\r': command not found
     + ls -l
     + $'head\r'
     ./128.bash: line 11: $'head\r': command not found
     + exit $'0\r'
     : numeric argument required0


The "od" calls are intended to show that the carriage returns are
getting in there, but the following error messages are showing that
IFS apparently has no effect, despite the man page saying

     IFS  The Internal Field Separator that is used for word splitting
          after expansion and to split lines into words with the read
          builtin command.  The default value is
          ``<space><tab><newline>''.

Anyone have any ideas on why IFS doesn't work to deal with carriage
returns?

(Note that adding carriage return to IFS is still an inferior notion
to "set -o igncr".  IFSing would effectively put a space at the end of
each line, so I expect that
     line arg1 arg2 arg3 \
         arg4 arg5
would not work.  I would also exspect here-documents like
     some pipe <<EOF
line1
line2
EOF
would need their carriage returns stripped.  In contrast, "set -o
igncr" strips carriage returns even in these contexts, so they work
as-is.   I'm asking about IFS merely because I'm curious.)

-- 
Tim McDaniel, tmcd@panix.com

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list