Barry Lind writes:
> Attached is a set of changes to pg_ctl that I have been using that fixes
> problems I have had with pg_ctl when the paths contains spaces.
> ! CMDNAME=`basename "$0"`
OK.
>   else
>           # look for it in PATH ('which' command is not portable)
> !         for dir in `echo "$PATH" | sed 's/ /\\\_/g' | sed 's/:/ /g'`
>       do
> +                 dir="`echo $dir | sed 's/\\\_/ /g'`"
>                   # empty entry in path means current dir
>                   [ -z "$dir" ] && dir='.'
Probably better to do this with IFS.  Btw., this piece of code exists in
identical form in most other PostgreSQL shell scripts.  Do you intend to
fix those as well?
> ! DEFPOSTOPTS="$PGDATA/postmaster.opts.default"
> ! POSTOPTSFILE="$PGDATA/postmaster.opts"
> ! PIDFILE="$PGDATA/postmaster.pid"
This is not necessary.
>   if [ "$op" = "status" ];then
> !     if [ -f "$PIDFILE" ];then
> !     PID=`sed -n 1p "$PIDFILE"`
>       if [ $PID -lt 0 ];then
... more similar stuff OK ...
>       else
>           # if we are in restart mode, then look for postmaster.opts
> !         eval set X "`cat "$POSTOPTSFILE"`"; shift
>               po_path="$1"
That is not portable.  There is no portable way to have double quotes
within backticks within double quotes.  You might be able to do something
along the lines of
    foo=`cat "$POSTOPTSFILE"`
    eval set X "$foo"; shift
The expression in question was carefully engineered to handle single
quotes and spaces in the POSTOPTSFILE correctly, so be careful. ;-)
>       if [ -n "$oldpid" ];then
>       sleep 1
> !     if [ -f "$PIDFILE" ];then
> !         if [ "`sed -n 1p "$PIDFILE"`" = "$oldpid" ];then
>           echo "$CMDNAME: cannot start postmaster" 1>&2
>           echo "Examine the log output." 1>&2
Same problem here.
--
Peter Eisentraut   peter_e@gmx.net   http://funkturm.homeip.net/~peter