On 02/12/2012 8:25 AM, Marcus C. Gottwald wrote:
>
> Hello Chris,
>
> you wrote (Sat 2012-Dec-01 18:18:47 -0400):
>
>> cat - |
>> while read line
>
> Note that Bash's "read" without "-r" does some sort of backslash
> escaping. I'm not sure which characters are special and what
> exactly is replaced with what; but at the least, you'll get some
> backslashes stripped. When processing unknown input using "read",
> you'll almost always want to use "-r".
>
>     $ echo 'a\\\b' | while read ; do echo "$REPLY" ; done
>     a\b
>     $ echo 'a\\b' | while read ; do echo "$REPLY" ; done
>     a\b
>     $ echo 'a\\b' | while read -r ; do echo "$REPLY" ; done
>     a\\b
>     $ echo '\\\' | while read ; do echo "$REPLY" ; done
>     $
>
>
>>       line=`echo $line | sed 's/\(From: *[^ ]*\)/\[email protected]/'`
> ..
>>     echo $line >> $tmpfile
>
> Note that "echo" (without "-e") simply reads all arguments and
> produces them as its output. In the lines above, the contents of
> the variable "line" will be split into words (by Bash) and passed
> to "echo" as multiple arguments. If those words were delimited
> (including e.g. leading and trailing whitespace) by something other
> than the delimiter used by "echo" on its output side (which should
> be the first character of the "IFS" special variable, i.e. usually
> a space), the other delimiters will be lost. To avoid having Bash
> split the variable value into words, make sure the contents of the
> variable gets passed to "echo" as a single argument:
>
>     $ LINE='one  two'
>     $ echo $LINE
>     one two
>     $ echo "$LINE"
>     one  two
>
>
>> cat $tmpfile | $msmtp_path $@
>
> Note that $@ is different from "$@". The latter form ensures that
> each argument given to your script will be passed as one argument
> instead of getting treated by word-splitting:
>
>     $ sh -c 'echo $@ ; echo "$@"' -- 'one  two' ' three  four'
>     one two three four
>     one  two  three  four
>
>
> Your script also doesn't seem to make a difference between an
> email's header and the body. And it isn't really prepared for
> filenames containing whitespace. A shorter suggestion (not tested,
> simply picking up your sed command) would be:
>
>     #!/bin/sh
>     #this replaces /usr/sbin/sendmail and adds domain to from address
>
>     sed '1,/^$/ {s/\(From: *[^ ]*\)/\[email protected]/}' | 
> /usr/bin/msmtp "$@"
>

I was waiting for someone to recognize my poor bash scripting abilities...

I've briefly tested your script and it seems to work well.  It's 
certainly a much more elegant solution.  Thanks for your feedback and 
the resulting script.  I'll be sure to put it to use.


-- 
Chris Purves
Visit my blog: http://chris.northfolk.ca

"Just look at the world around you; tell me why is there so much need. 
Because of greed." - Damien Dempsey

------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
msmtp-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/msmtp-users

Reply via email to