Pattern: Use of literal carriage return in shell script
Issue: -
The script uses Windows/DOS style \r\n
line terminators instead of UNIX style \n
terminators. The additional \r
aka ^M
aka carriage return characters will be treated literally, and results in all sorts strange bugs and messages.
You can verify this with cat -v yourfile
and see whether or not each line ends with a ^M
. To delete them, open the file in your editor and save the file as "Unix", "UNIX/OSX Format", :set ff=unix
or similar if it supports it.
If you don't know how to get your editor to save a file with Unix line terminators, you can use tr
:
tr -d '\r' < badscript > goodscript
This will read a script badscript
with possible carriage returns, and write goodscript
without them.
Example of incorrect code:
$ cat -v somescript
#!/bin/sh^M
echo "Hello World"^M
Example of correct code:
$ cat -v somescript
#!/bin/sh
echo "Hello World"