On Jun 20, 2013, at 7:57 AM, Alexander Yerenkow wrote:

> Hello all!
> 
> I have a problem with port JBoss72, which tries to behave as long-standing
> port jboss5:
> 
> http://svnweb.freebsd.org/ports/head/java/jboss5/files/jboss5.in?revision=302141&view=markup
> 
> 
> 
> In rc run script there is such line:
> 
> %%APP_SHORTNAME%%_logging="${%%APP_SHORTNAME%%_logging:-">>
> ${%%APP_SHORTNAME%%_logdir}/stdout.log 2>>
> ${%%APP_SHORTNAME%%_logdir}/stderr.log"}"
> 
> Which provides way to overwrite default log location in /etc/rc.conf.
> 
> But this not working at all, all these redirects treated as simple
> parameters for run script.
> 
> I made small test, to show my problem:
> 
> #!/bin/sh
> 
> logfile="supposed-to-be.log"
> log=">> ${logfile}"
> echo "a1" >> ${logfile}
> echo "a2" ${log}
> cmd="echo \"a3\" ${log}"
> echo $cmd
> $cmd
> more ${logfile}
> 
> Here's execution output:
> 
> # ./t1.sh
> a2 >> supposed-to-be.log
> echo "a3" >> supposed-to-be.log
> "a3" >> supposed-to-be.log
> a1
> 
> 1. My question is - Which are correct way to specify such redirects to be
> overridden?
> 

If you must have a conditional redirect in the above manner (in which the 
redirect syntax is part of a variable):

to_foofile=">> foofile"
eval echo \"a1\" $to_foofile

The shell will do a first-pass on the arguments, so what "eval" sees as 
arguments are:

echo "a1" >> foofile

And thus, eval does what it does best… evaluates the expressions as a set of 
shell statements.

NOTE: The rc script probably assumed bash and was ported from another system 
where /bin/sh was indeed bash (but in FreeBSD, /bin/sh is not bash and is much 
more strict in adhering to POSIX standards).

However, I can't in all earnest recommend that approach as a method of 
conditional logging when there are so many better solutions.

Here's one of my favorites for quick-and-dirty conditional logging:

===

#!/bin/sh

if : some condition to enable debugging; then
        exec 3>>/tmp/log.stdout 4>>/tmp/log.stderr
else
        exec 3>&1 4>&2
fi

echo "a1" 1>&3 2>&4
        # "a1" ends up in /tmp/log.stdout

ls /nosuchfile 1>&3 2>&4
        # You get in /tmp/log.stderr: "ls: /nosuchfile: No such file or 
directory"

===

So rather than having to prefix "eval" to every command *and* escape all the 
quotes and expansions… the above instead changes from (old) attempting to use a 
conditional redirect syntax (by way of $logging variable) to (new/above) having 
every command redirect stdout/stderr but having the destinations of the 
redirect change based on some pre-condition.



> 2. tomcat6.in, rubyrep.in, tclhttpd.in, geoserver.in, and many more rc
> scripts from ports are using something like this:
> 
> log_args=">> ${tclhttpd_stdout_log} 2>> ${tclhttpd_stderr_log} "
> 
> and after that use $log_args.
> 
> Are they silently broken, or am I missing something?
> 

I would call that broken if the invocation line at the top of the script is 
#!/bin/sh (it may not be broken if you instead see something like 
"#!/usr/bin/env bash").




> 3. Should I build up $cmd, and run
> eval "$cmd" - would this be nice ro dirty hack?
> 

Nah… just go through and replace "$log_args" with either "1>&3 2>&4" or ">&3 
2>&4" (the leading 1 on ">&" in the first option is actually the implied 
default, so you can omit it and go for the second option if you like; however 
since you can't say "exec 3>&" and have to say "exec 3>&1", I tend to think the 
first option is more explicitly-clear in what's going on with the 
file-descriptors).



> Thanks!
> 

No problem. Glad to help.
-- 
Devin

_____________
The information contained in this message is proprietary and/or confidential. 
If you are not the intended recipient, please: (i) delete the message and all 
copies; (ii) do not disclose, distribute or use the message in any manner; and 
(iii) notify the sender immediately. In addition, please be aware that any 
message addressed to our domain is subject to archiving and review by persons 
other than the intended recipient. Thank you.
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[email protected]"

Reply via email to