|
You don't say what os you're using, what language you're trying to use, or give much info on how the script is used (always for one particular user? for everyone on the system?). I will assume that you're using Solaris 10, trying to program in ksh, and running the script for every user on the box. If these assumptions are wrong, your mileage may vary.
There are several problems with your code. I see the comment where you claim the mailfile is always blank. But the code which is present to handle a non-blank mailfile is guaranteed to fail and should be removed. Leaving broken remnants of old code in a script is asking for trouble down the road. I have never seen syntax like:
while ( [ $mailstat -eq 0 ] )
I think that may be legal. It might even be useful with a much more complex test. The normal syntax is:
while [ $mailstat -eq 0 ]
Your parentheses are demanding that the test be preformed in a subshell. The exit code of the subshell should be the exit code of the [ command in this case. But you are starting an extra process for no good reason. More to the point, the loop is not useful. You should be doing:
1) check for existence of mail, exit if none
2) save any mail present
There is a concurrency issue here... mail may be present during step 1 and absent during step 2. Step 2 needs to accept that...it is not an error. Step 2 should be a one shot deal, not a loop. If new mail arrives immediately after the save, your script will get to it the next time it is launched. You are looping, probably not to handle newly arrived mail, but rather to handle one message at a time. That is not efficient. "save * filename" will grab all of the mail at once. It is more efficient and eliminates most of your problem.
mailx initializes itself by processing a system-wide startup script. Then it processes a user specific startup script. A -n will inhibit the former but not the latter. The mailx man page says the save command "Save the specified messages in the given file. The file is created if it does not exist. The file defaults to mbox. The message is deleted from the mailbox when mailx terminates unless keepsave is set (see also Internal Variables and the exit and quit commands). If a user has a .mailrc that sets keepsave, your script will not empty his mailbox. This is my best guess as to why you have your current problem and I don't know what to suggest. I don't think you should override a user's wishes without consulting with the user in question.
|