Ok, so I'll throw in my view too.

On September 5, 2016 1:24:17 PM GMT+02:00, Anthony Coulter 
<[email protected]> wrote:
>Some of the system scripts make inconsistent use of ksh-specific
>features, specifically "print" and "[[" as efficient replacements for
>"echo" and "[". This change makes the /etc/ksh.kshrc and all the rc
>scripts use "print" and "[[" exclusively.

Why are they more efficient? They're all builtins.

>
>Switching from echo to print only brought up one interesting issue:
>/etc/rc.d/mountd uses "print -n >foo" instead of "touch foo".
>The latter is arguably more transparent but I didn't change to it.

Also it does not empty the file.

I'd do
  >foo
or possibly
  :>foo

>
>Switching from [ to [[ makes a lot of things more readable; most of
>the improvements result from removing unnecessary quotation marks.
>We also don't have to test for unset variables as aggressively; a
>number of awkward [ X"$foo" = XYes ] constructions were replaced
>with [[ $foo = Yes ]] .

A POSIX shell does not need the X'es. It needs quotes though.

>
>The test [[ ${_args} = "${_args# }" ]] appears in rcctl; I left the
>quotation marks on the right-hand side because I'm afraid of breaking
>something I don't understand.

Without quotes (on the right side) the expression is subject to pattern 
matching.

>
>The rcctl script also has a lot of lines like:
>       daemon_timeout="$(svc_getdef ${_svc} timeout)"
>I think the quotation marks are unnecessary

They are in our ksh, but I don't know what POSIX says.

> but the original author
>went to a lot of trouble to escape internal quotes, e.g.
>       daemon_flags="$(eval print \"\${${_svc}_flags}\")"

Since it uses $(...), those escaped quotes are unrelated to the outer quoting. 
This is by far the best reason to abandon backticks.

>so I'll give him the benefit of the doubt. I would encourage somone
>with greater confidence to take a closer look.
>
>I replaced `backticks` with $(subshell notation) in a few places, but
>only in places where I was already changing [ to [[. I wanted to remove
>them all but I can't really justify the change in terms of either
>readability or process efficiency.

As much as I hate them I love them, because oldschool. For simple cases I think 
there is no big reason to change them although I wouldn't introduce them in new 
code.

>
>Regarding numeric changes: in ksh, [[ 0 -eq 00 ]] is true (numeric
>comparison) but [[ 0 = 00 ]] is false (string comparison). The latter
>is more readable, so I made the switch in places where the left-hand
>side is a system output, e.g. [[ $(id -u ) = 0 ]] or [[ $# > 0 ]].
>I would not expect id(1) to print the string "00" for root, nor would
>I expect the shell to print "00" for $#. But I did *not* change
>comparison operators in more complicated situations, like the bottom
>of /etc/rc which has [[ ${daemon_rtable} -eq 0 ]]. It isn't immediately
>obvious what sort of string is in ${daemon_rtable} so the numeric
>comparison seems appropriate here.

I also tend to check $# = 0 but I never consider it a numeric comparison. If I 
understand you correctly, you want to change a numeric comparison to a string 
comparison. That is a style change, and with no defined code style for shell 
scripts, that could change back and forth forever. I see no point in that.

>
>I corrected a comment at the top of /etc/rc; it said that "set +o sh"
>turned Strict Bourne shell mode off. I'm pretty sure it's actually
>turning strict mode on.

As pointed out already, you were wrong.

-o sets, +o sunsets.

>
>My system still boots with these changes, and rcctl still appears to
>work. I can't easily test all of the code paths in each of the rc
>scripts. But the changes involved here are straightforward, and you
>can validate this diff line-by-line.

While I understand your reasoning, please beware that sending diffs that are 
untested requires other to do your job, and is not a good way to make someone 
willing to look into the subject.

And the diff is far too big. Find *one* (1) *problem*, fix that, test it, and 
send a diff."

I'll end this with a reply I sent off-list regarding parts of this email:

"AFAICT, this does not fix anything, so I don't see the reason for forcibly 
changing from working sh syntax to ksh'isms just "because we can". [] is as 
valid ksh as [[]], and I believe practicing writing portable (at least as far 
as posix) shell scripts is worthwhile, unless it becomes too messy."

Note that this is not meant to being you down. Small (where possible) diffs, 
tested and justified is the way to go.

/Alexander

>
>
>Index: etc/ksh.kshrc
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/ksh.kshrc,v
>retrieving revision 1.20
>diff -u -p -u -r1.20 ksh.kshrc
>--- etc/ksh.kshrc      18 Feb 2015 08:39:32 -0000      1.20
>+++ etc/ksh.kshrc      5 Sep 2016 04:03:43 -0000
>@@ -62,7 +62,7 @@ case "$-" in
>       case "$TERM" in
>       sun*-s)
>               # sun console with status line
>-              if [ "$tty" != "$console" ]; then
>+              if [[ $tty != $console ]]; then
>                       # ilabel
>                       ILS='\033]L'; ILE='\033\\'
>                       # window title bar
>@@ -81,7 +81,7 @@ case "$-" in
>       *)      ;;
>       esac
>       # do we want window decorations?
>-      if [ "$ILS" ]; then
>+      if [[ -n $ILS ]]; then
>               function ilabel { print -n "${ILS}$*${ILE}">/dev/tty; }
>               function label { print -n "${WLS}$*${WLE}">/dev/tty; }
> 
>@@ -136,14 +136,14 @@ function no_path {
> }
> # if $1 exists and is not in path, append it
> function add_path {
>-  [ -d ${1:-.} ] && no_path $* && eval ${2:-PATH}="\$${2:-PATH}:$1"
>+  [[ -d ${1:-.} ]] && no_path $* && eval ${2:-PATH}="\$${2:-PATH}:$1"
> }
> # if $1 exists and is not in path, prepend it
> function pre_path {
>-  [ -d ${1:-.} ] && no_path $* && eval ${2:-PATH}="$1:\$${2:-PATH}"
>+  [[ -d ${1:-.} ]] && no_path $* && eval ${2:-PATH}="$1:\$${2:-PATH}"
> }
> # if $1 is in path, remove it
> function del_path {
>-  no_path $* || eval ${2:-PATH}=`eval echo :'$'${2:-PATH}: |
>+  no_path $* || eval ${2:-PATH}=`eval print :'$'${2:-PATH}: |
>     sed -e "s;:$1:;:;g" -e "s;^:;;" -e "s;:\$;;"`
> }
>Index: etc/rc
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc,v
>retrieving revision 1.486
>diff -u -p -u -r1.486 rc
>--- etc/rc     10 Jul 2016 09:08:18 -0000      1.486
>+++ etc/rc     4 Sep 2016 14:26:10 -0000
>@@ -4,7 +4,7 @@
># Output and error are redirected to console by init, and the console
>is the
> # controlling terminal.
> 
>-# Turn off Strict Bourne shell.
>+# Turn on Strict Bourne shell.
> set +o sh
> 
> # Subroutines (have to come first).
>@@ -137,14 +137,14 @@ make_keys() {
>       local _iked_pub=/etc/iked/local.pub
> 
>       if [[ ! -f $_isakmpd_key ]]; then
>-              echo -n "openssl: generating isakmpd/iked RSA keys... "
>+              print -n "openssl: generating isakmpd/iked RSA keys... "
>               if openssl genrsa -out $_isakmpd_key 2048 >/dev/null 2>&1 &&
>                       chmod 600 $_isakmpd_key &&
>                       openssl rsa -out $_isakmpd_pub -in $_isakmpd_key \
>                           -pubout >/dev/null 2>&1; then
>-                      echo done.
>+                      print done.
>               else
>-                      echo failed.
>+                      print failed.
>               fi
>       fi
> 
>@@ -167,7 +167,7 @@ reorder_libs() {
>       # Skip if /usr/lib is on a nfs mounted filesystem.
>       [[ $_mp == *' type nfs '* ]] && return
> 
>-      echo -n 'reordering libraries:'
>+      print -n 'reordering libraries:'
> 
>       # Only choose the latest version of the libraries.
>       for _liba in /usr/lib/libc.so.*.a; do
>@@ -183,7 +183,7 @@ reorder_libs() {
>               if mount -u -w $_dkdev; then
>                       _remount=true
>               else
>-                      echo ' failed.'
>+                      print ' failed.'
>                       return
>               fi
>       fi
>@@ -210,9 +210,9 @@ reorder_libs() {
>       fi
> 
>       if $_error; then
>-              echo ' failed.'
>+              print ' failed.'
>       else
>-              echo ' done.'
>+              print ' done.'
>       fi
> }
> 
>@@ -237,21 +237,21 @@ do_fsck() {
>       0)      ;;
>       2)      exit 1
>               ;;
>-      4)      echo "Rebooting..."
>+      4)      print "Rebooting..."
>               reboot
>-              echo "Reboot failed; help!"
>+              print "Reboot failed; help!"
>               exit 1
>               ;;
>-      8)      echo "Automatic file system check failed; help!"
>+      8)      print "Automatic file system check failed; help!"
>               exit 1
>               ;;
>-      12)     echo "Boot interrupted."
>+      12)     print "Boot interrupted."
>               exit 1
>               ;;
>       130)    # Interrupt before catcher installed.
>               exit 1
>               ;;
>-      *)      echo "Unknown error; help!"
>+      *)      print "Unknown error; help!"
>               exit 1
>               ;;
>       esac
>@@ -282,26 +282,26 @@ FUNCS_ONLY=1 . /etc/rc.d/rc.subr
> _rc_parse_conf
> 
> if [[ $1 == shutdown ]]; then
>-      if echo 2>/dev/null >>/var/db/host.random || \
>-          echo 2>/dev/null >>/etc/random.seed; then
>+      if print 2>/dev/null >>/var/db/host.random || \
>+          print 2>/dev/null >>/etc/random.seed; then
>               random_seed
>       else
>-              echo warning: cannot write random seed to disk
>+              print warning: cannot write random seed to disk
>       fi
> 
>       # If we are in secure level 0, assume single user mode.
>       if (($(sysctl -n kern.securelevel) == 0)); then
>-              echo 'single user: not running shutdown scripts'
>+              print 'single user: not running shutdown scripts'
>       else
>               pkg_scripts=${pkg_scripts%%*( )}
>               if [[ -n $pkg_scripts ]]; then
>-                      echo -n 'stopping package daemons:'
>+                      print -n 'stopping package daemons:'
>                       while [[ -n $pkg_scripts ]]; do
>                               _d=${pkg_scripts##* }
>                               pkg_scripts=${pkg_scripts%%*( )$_d}
>                               [[ -x /etc/rc.d/$_d ]] && /etc/rc.d/$_d stop
>                       done
>-                      echo '.'
>+                      print '.'
>               fi
> 
>               [[ -f /etc/rc.shutdown ]] && sh /etc/rc.shutdown
>@@ -319,13 +319,13 @@ fi
> swapctl -A -t blk
> 
> if [[ -e /fastboot ]]; then
>-      echo "Fast boot: skipping disk checks."
>+      print "Fast boot: skipping disk checks."
> elif [[ $1 == autoboot ]]; then
>-      echo "Automatic boot in progress: starting file system checks."
>+      print "Automatic boot in progress: starting file system checks."
>       do_fsck
> fi
> 
>-trap "echo 'Boot interrupted.'; exit 1" 3
>+trap "print 'Boot interrupted.'; exit 1" 3
> 
> umount -a >/dev/null 2>&1
> mount -a -t nonfs,vnd
>@@ -333,7 +333,7 @@ mount -uw /                # root on nfs requires this
> rm -f /fastboot               # XXX (root now writeable)
> 
># Set flags on ttys.  (Do early, in case they use tty for SLIP in
>netstart.)
>-echo 'setting tty flags'
>+print 'setting tty flags'
> ttyflags -a
> 
> # Set keyboard encoding.
>@@ -378,7 +378,7 @@ fill_baddynamic tcp
> 
> sysctl_conf
> 
>-echo 'starting network'
>+print 'starting network'
> 
> # Set carp interlock by increasing the demotion counter.
> # Prevents carp from preempting until the system is booted.
>@@ -420,24 +420,24 @@ dmesg >/var/run/dmesg.boot       # Save a copy
> 
> make_keys
> 
>-echo -n 'starting early daemons:'
>+print -n 'starting early daemons:'
> start_daemon syslogd ldattach pflogd nsd rebound unbound ntpd
> start_daemon iscsid isakmpd iked sasyncd ldapd npppd
>-echo '.'
>+print '.'
> 
> # Load IPsec rules.
> if [[ $ipsec != NO && -f /etc/ipsec.conf ]]; then
>       ipsecctl -f /etc/ipsec.conf
> fi
> 
>-echo -n 'starting RPC daemons:'
>+print -n 'starting RPC daemons:'
> start_daemon portmap ypldap
> rm -f /var/run/ypbind.lock
> if [[ -n $(domainname) ]]; then
>       start_daemon ypserv ypbind
> fi
> start_daemon mountd nfsd lockd statd amd
>-echo '.'
>+print '.'
> 
> # Check and mount remaining file systems and enable additional swap.
> mount -a
>@@ -452,9 +452,9 @@ if [[ -d /var/crash ]]; then
> fi
> 
> if [[ $check_quotas == YES ]]; then
>-      echo -n 'checking quotas:'
>+      print -n 'checking quotas:'
>       quotacheck -a
>-      echo ' done.'
>+      print ' done.'
>       quotaon -a
> fi
> 
>@@ -472,7 +472,7 @@ if [[ -f /etc/ptmp ]]; then
>           'password file may be incorrect -- /etc/ptmp exists'
> fi
> 
>-echo clearing /tmp
>+print clearing /tmp
> 
> # Prune quickly with one rm, then use find to clean up /tmp/[lqv]*
> # (not needed with mfs /tmp, but doesn't hurt there...).
>@@ -497,7 +497,7 @@ if [[ ! -f /etc/motd ]]; then
> fi
> if T=$(mktemp /tmp/_motd.XXXXXXXXXX); then
>       sysctl -n kern.version | sed 1q >$T
>-      echo "" >>$T
>+      print "" >>$T
>       sed '1,/^$/d' </etc/motd >>$T
>       cmp -s $T /etc/motd || cp $T /etc/motd
>       rm -f $T
>@@ -505,23 +505,23 @@ fi
> 
> if [[ $accounting == YES ]]; then
>       [[ ! -f /var/account/acct ]] && touch /var/account/acct
>-      echo 'turning on accounting'
>+      print 'turning on accounting'
>       accton /var/account/acct
> fi
> 
> if [[ -x /sbin/ldconfig ]]; then
>-      echo 'creating runtime link editor directory cache.'
>+      print 'creating runtime link editor directory cache.'
>       [[ -d /usr/local/lib ]] && shlib_dirs="/usr/local/lib $shlib_dirs"
>       [[ -d /usr/X11R6/lib ]] && shlib_dirs="/usr/X11R6/lib $shlib_dirs"
>       ldconfig $shlib_dirs
> fi
> 
>-echo 'preserving editor files.'; /usr/libexec/vi.recover
>+print 'preserving editor files.'; /usr/libexec/vi.recover
> 
># If rc.sysmerge exists, run it just once, and make sure it is deleted.
> run_upgrade_script sysmerge
> 
>-echo -n 'starting network daemons:'
>+print -n 'starting network daemons:'
> start_daemon ldomd vmd sshd snmpd ldpd ripd ospfd ospf6d bgpd ifstated
> start_daemon relayd dhcpd dhcrelay mrouted dvmrpd radiusd eigrpd
> 
>@@ -534,22 +534,22 @@ fi
> start_daemon hostapd lpd smtpd slowcgi httpd ftpd
>start_daemon ftpproxy ftpproxy6 tftpd tftpproxy identd inetd rarpd
>bootparamd
> start_daemon rbootd mopd spamd spamlogd sndiod
>-echo '.'
>+print '.'
> 
># If rc.firsttime exists, run it just once, and make sure it is
>deleted.
> run_upgrade_script firsttime
> 
> # Run rc.d(8) scripts from packages.
> if [[ -n $pkg_scripts ]]; then
>-      echo -n 'starting package daemons:'
>+      print -n 'starting package daemons:'
>       for _daemon in $pkg_scripts; do
>               if [[ -x /etc/rc.d/$_daemon ]]; then
>                       start_daemon $_daemon
>               else
>-                      echo -n " ${_daemon}(absent)"
>+                      print -n " ${_daemon}(absent)"
>               fi
>       done
>-      echo '.'
>+      print '.'
> fi
> 
> [[ -f /etc/rc.local ]] && sh /etc/rc.local
>@@ -558,9 +558,9 @@ ifconfig -g carp -carpdemote 128   # Disab
> 
> mixerctl_conf
> 
>-echo -n 'starting local daemons:'
>+print -n 'starting local daemons:'
> start_daemon apmd sensorsd hotplugd watchdogd cron wsmoused xdm
>-echo '.'
>+print '.'
> 
> date
> exit 0
>Index: etc/rc.d/amd
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/amd,v
>retrieving revision 1.7
>diff -u -p -u -r1.7 amd
>--- etc/rc.d/amd       15 Jul 2015 13:50:54 -0000      1.7
>+++ etc/rc.d/amd       5 Sep 2016 01:54:10 -0000
>@@ -11,7 +11,7 @@ rc_reload=NO
> rc_stop=NO
> 
> rc_pre() {
>-      [ -e ${amd_master} ] || return 1
>+      [[ -e ${amd_master} ]] || return 1
>       daemon_flags="${daemon_flags} $(print -rn -- $(< ${amd_master}))"
> }
> 
>Index: etc/rc.d/bootparamd
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/bootparamd,v
>retrieving revision 1.2
>diff -u -p -u -r1.2 bootparamd
>--- etc/rc.d/bootparamd        8 Jul 2011 02:15:34 -0000       1.2
>+++ etc/rc.d/bootparamd        5 Sep 2016 01:54:29 -0000
>@@ -9,7 +9,7 @@ daemon="/usr/sbin/rpc.bootparamd"
> rc_reload=NO
> 
> rc_pre() {
>-      [ -s /etc/bootparams ]
>+      [[ -s /etc/bootparams ]]
> }
> 
> rc_cmd $1
>Index: etc/rc.d/iked
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/iked,v
>retrieving revision 1.3
>diff -u -p -u -r1.3 iked
>--- etc/rc.d/iked      19 Dec 2015 13:45:12 -0000      1.3
>+++ etc/rc.d/iked      5 Sep 2016 02:58:28 -0000
>@@ -9,7 +9,7 @@ daemon="/sbin/iked"
> pexp="iked: parent.*"
> 
> rc_pre() {
>-      [ X"${sasyncd_flags}" != X"NO" ] && \
>+      [[ ${sasyncd_flags} != NO ]] && \
>               daemon_flags="-S ${daemon_flags}"
>       #return 0
>       # child will not return a config parsing error to the parent
>Index: etc/rc.d/isakmpd
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/isakmpd,v
>retrieving revision 1.1
>diff -u -p -u -r1.1 isakmpd
>--- etc/rc.d/isakmpd   6 Jul 2011 18:55:36 -0000       1.1
>+++ etc/rc.d/isakmpd   5 Sep 2016 02:57:07 -0000
>@@ -9,7 +9,7 @@ daemon="/sbin/isakmpd"
> pexp="isakmpd: monitor \[priv\]"
> 
> rc_pre() {
>-      [ X"${sasyncd_flags}" != X"NO" ] && \
>+      [[ ${sasyncd_flags} != NO ]] && \
>               daemon_flags="-S ${daemon_flags}"
>       return 0
> }
>Index: etc/rc.d/ldattach
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/ldattach,v
>retrieving revision 1.2
>diff -u -p -u -r1.2 ldattach
>--- etc/rc.d/ldattach  8 Jul 2011 02:15:34 -0000       1.2
>+++ etc/rc.d/ldattach  5 Sep 2016 03:37:53 -0000
>@@ -9,7 +9,7 @@ daemon="/sbin/ldattach"
> rc_reload=NO
> 
> rc_pre() {
>-      [ -n "${ldattach_flags}" ]
>+      [[ -n ${ldattach_flags} ]]
> }
> 
> rc_cmd $1
>Index: etc/rc.d/mopd
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/mopd,v
>retrieving revision 1.3
>diff -u -p -u -r1.3 mopd
>--- etc/rc.d/mopd      19 Sep 2011 20:42:24 -0000      1.3
>+++ etc/rc.d/mopd      5 Sep 2016 01:56:08 -0000
>@@ -10,7 +10,7 @@ daemon_flags="-a"
> rc_reload=NO
> 
> rc_pre() {
>-      [ -d /tftpboot/mop ]
>+      [[ -d /tftpboot/mop ]]
> }
> 
> rc_cmd $1
>Index: etc/rc.d/mountd
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/mountd,v
>retrieving revision 1.6
>diff -u -p -u -r1.6 mountd
>--- etc/rc.d/mountd    26 Dec 2015 09:55:15 -0000      1.6
>+++ etc/rc.d/mountd    5 Sep 2016 01:56:19 -0000
>@@ -10,9 +10,9 @@ pexp="mountd: \[priv\]"
> rc_stop=NO
> 
> rc_pre() {
>-      [ -s /etc/exports ] && grep -qv '^#' /etc/exports && \
>+      [[ -s /etc/exports ]] && grep -qv '^#' /etc/exports && \
>               rm -f /var/db/mountdtab && \
>-              echo -n > /var/db/mountdtab
>+              print -n > /var/db/mountdtab
> }
> 
> rc_cmd $1
>Index: etc/rc.d/nfsd
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/nfsd,v
>retrieving revision 1.6
>diff -u -p -u -r1.6 nfsd
>--- etc/rc.d/nfsd      22 Aug 2014 08:10:38 -0000      1.6
>+++ etc/rc.d/nfsd      5 Sep 2016 01:56:28 -0000
>@@ -12,7 +12,7 @@ pexp="(${daemon}( |$)|nfsd: (master|serv
> rc_reload=NO
> 
> rc_pre() {
>-      [ -s /etc/exports ] && grep -qv '^#' /etc/exports
>+      [[ -s /etc/exports ]] && grep -qv '^#' /etc/exports
> }
> 
> rc_cmd $1
>Index: etc/rc.d/rarpd
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/rarpd,v
>retrieving revision 1.3
>diff -u -p -u -r1.3 rarpd
>--- etc/rc.d/rarpd     19 Sep 2011 20:42:24 -0000      1.3
>+++ etc/rc.d/rarpd     5 Sep 2016 01:56:38 -0000
>@@ -10,7 +10,7 @@ daemon_flags="-a"
> rc_reload=NO
> 
> rc_pre() {
>-      [ -s /etc/ethers ]
>+      [[ -s /etc/ethers ]]
> }
> 
> rc_cmd $1
>Index: etc/rc.d/rc.subr
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/rc.subr,v
>retrieving revision 1.115
>diff -u -p -u -r1.115 rc.subr
>--- etc/rc.d/rc.subr   31 Aug 2016 08:47:11 -0000      1.115
>+++ etc/rc.d/rc.subr   5 Sep 2016 03:27:03 -0000
>@@ -20,20 +20,20 @@ _rc_actions="start stop restart reload c
> readonly _rc_actions
> 
> _rc_err() {
>-      [ -n "${1}" ] && echo "${1}" 1>&2
>-      [ -n "${2}" ] && exit "${2}" || exit 1
>+      [[ -n ${1} ]] && print "${1}" 1>&2
>+      [[ -n ${2} ]] && exit "${2}" || exit 1
> }
> 
> _rc_not_supported() {
>       local _a _enotsup _what=${1}
>       for _a in ${_rc_actions}; do
>-              [ "${_what}" == "restart" ] && _what="stop"
>-              if [ "${_what}" == "${_a}" ]; then
>+              [[ ${_what} == restart ]] && _what="stop"
>+              if [[ ${_what} == ${_a} ]]; then
>                       eval _enotsup=\${rc_${_what}}
>                       break
>               fi
>       done
>-      [ X"${_enotsup}" == X"NO" ]
>+      [[ ${_enotsup} == NO ]]
> }
> 
> _rc_usage() {
>@@ -45,7 +45,7 @@ _rc_usage() {
> }
> 
> _rc_write_runfile() {
>-      [ -d ${_RC_RUNDIR} ] || mkdir -p ${_RC_RUNDIR} && \
>+      [[ -d ${_RC_RUNDIR} ]] || mkdir -p ${_RC_RUNDIR} && \
>               cat >${_RC_RUNFILE} <<EOF
> daemon_class=${daemon_class}
> daemon_flags=${daemon_flags}
>@@ -61,8 +61,8 @@ _rc_rm_runfile() {
> }
> 
> _rc_do() {
>-      if [ -n "${_RC_DEBUG}" ]; then
>-              echo "doing $@" && "$@"
>+      if [[ -n ${_RC_DEBUG} ]]; then
>+              print "doing $@" && "$@"
>       else
>               "$@" >/dev/null 2>&1
>       fi
>@@ -70,14 +70,14 @@ _rc_do() {
> 
> _rc_exit() {
>       local _pfix
>-      [ -z "${INRC}" -o X"$1" != X"ok" ] && _pfix="($1)"
>-      echo ${INRC:+'-n'} "${_pfix}"
>-      [ X"$1" = X"ok" ] && exit 0 || exit 1
>+      [[ -z ${INRC} || $1 != ok ]] && _pfix="($1)"
>+      print ${INRC:+'-n'} "${_pfix}"
>+      [[ $1 = ok ]] && exit 0 || exit 1
> }
> 
> _rc_wait() {
>       local _i=0
>-      while [ $_i -lt ${daemon_timeout} ]; do
>+      while [[ $_i -lt ${daemon_timeout} ]]; do
>               case "$1" in
>               reload|start)
>                       _rc_do rc_check && return 0 ;;
>@@ -95,25 +95,25 @@ _rc_wait() {
> _rc_quirks() {
>       # special care needed for spamlogd to avoid starting it up and failing
>       # all the time
>-      if [  X"${spamd_flags}" = X"NO" -o X"${spamd_black}" != X"NO" ]; then
>+      if [[  ${spamd_flags} = NO || ${spamd_black} != NO ]]; then
>               spamlogd_flags=NO
>       fi
> 
>       # special care needed for pflogd to avoid starting it up and failing
>       # if pf is not enabled
>-      if [ X"${pf}" = X"NO" ]; then
>+      if [[ ${pf} = NO ]]; then
>               pflogd_flags=NO
>       fi
> 
>       # special care needed if nfs_server=YES to startup nfsd and mountd
>with
>       # sane default flags
>-      if [ X"${nfs_server}" = X"YES" ]; then
>-              [ X"${nfsd_flags}" = X"NO" ] && nfsd_flags="-tun 4"
>-              [ X"${mountd_flags}" = X"NO" ] && mountd_flags=
>+      if [[ ${nfs_server} = YES ]]; then
>+              [[ ${nfsd_flags} = NO ]] && nfsd_flags="-tun 4"
>+              [[ ${mountd_flags} = NO ]] && mountd_flags=
>       fi
> 
>       # in case domainname is set and /var/yp/binding exists enable ypbind
>-      if [ X"`domainname`" != X"" -a -d /var/yp/binding ]; then
>+      if [[ -n $(domainname) && -d /var/yp/binding ]]; then
>               ypbind_flags=
>       fi
> }
>@@ -125,7 +125,7 @@ _rc_parse_conf() {
>               accounting amd_master check_quotas ipsec multicast nfs_server \
>               pexp pf pkg_scripts shlib_dirs spamd_black
> 
>-      [ $# -gt 0 ] || set -- /etc/rc.conf /etc/rc.conf.local
>+      [[ $# > 0 ]] || set -- /etc/rc.conf /etc/rc.conf.local
>       for _rcfile; do
>               [[ -f $_rcfile ]] || continue
>               while IFS='     ' read -r _l; do
>@@ -148,7 +148,7 @@ _rc_parse_conf() {
> }
> 
> # return if we only want internal functions
>-[ -n "${FUNCS_ONLY}" ] && return
>+[[ -n ${FUNCS_ONLY} ]] && return
> 
> rc_start() {
>       ${rcexec} "${daemon} ${daemon_flags} ${_bg}"
>@@ -169,34 +169,35 @@ rc_stop() {
> rc_cmd() {
>       local _bg _n
> 
>-      [ -n "${1}" ] && echo "${_rc_actions}" | grep -qw -- ${1} ||
>_rc_usage
>+      [[ -n ${1} ]] && print "${_rc_actions}" | grep -qw -- ${1} || \
>+              _rc_usage
> 
>-      [ "$(id -u)" -eq 0 ] || \
>-              [ X"${rc_usercheck}" != X"NO" -a X"$1" = "Xcheck" ] || \
>+      [[ $(id -u) = 0 ]] || \
>+              [[ ${rc_usercheck} != NO && $1 = check ]] || \
>               _rc_err "$0: need root privileges"
> 
>       if _rc_not_supported $1; then
>-              [ -n "${INRC}" ] && exit 1
>+              [[ -n ${INRC} ]] && exit 1
>               _rc_err "$0: $1 is not supported"
>       fi
> 
>-      [ X"${rc_bg}" = X"YES" ] && _bg="&"
>-      [ -n "${_RC_DEBUG}" ] || _n="-n"
>+      [[ ${rc_bg} = YES ]] && _bg="&"
>+      [[ -n ${_RC_DEBUG} ]] || _n="-n"
> 
>       _rc_do _rc_parse_conf ${_RC_RUNFILE}
> 
>       case "$1" in
>       check)
>-              echo $_n "${INRC:+ }${_name}"
>+              print $_n "${INRC:+ }${_name}"
>               _rc_do rc_check && _rc_exit ok
>               _rc_exit failed
>               ;;
>       start)
>-              if [ X"${daemon_flags}" = X"NO" ]; then
>+              if [[ ${daemon_flags} = NO ]]; then
>                       _rc_err "$0: need -f to force $1 since 
> ${_name}_flags=NO"
>               fi
>-              [ -z "${INRC}" ] && _rc_do rc_check && exit 0
>-              echo $_n "${INRC:+ }${_name}"
>+              [[ -z ${INRC} ]] && _rc_do rc_check && exit 0
>+              print $_n "${INRC:+ }${_name}"
>               while true; do  # no real loop, only needed to break
>                       if type rc_pre >/dev/null; then
>                               _rc_do rc_pre || break
>@@ -213,7 +214,7 @@ rc_cmd() {
>               ;;
>       stop)
>               _rc_do rc_check || exit 0
>-              echo $_n "${INRC:+ }${_name}"
>+              print $_n "${INRC:+ }${_name}"
>               _rc_do rc_stop || _rc_exit failed
>               _rc_do _rc_wait stop || _rc_exit failed
>               if type rc_post >/dev/null; then \
>@@ -223,7 +224,7 @@ rc_cmd() {
>               _rc_exit ok
>               ;;
>       reload)
>-              echo $_n "${INRC:+ }${_name}"
>+              print $_n "${INRC:+ }${_name}"
>               _rc_do rc_check && _rc_do rc_reload || _rc_exit failed
>               _rc_do _rc_wait reload || _rc_exit failed
>               _rc_exit ok
>@@ -238,7 +239,7 @@ rc_cmd() {
>       esac
> }
> 
>-[ -n "${daemon}" ] || _rc_err "$0: daemon is not set"
>+[[ -n ${daemon} ]] || _rc_err "$0: daemon is not set"
> 
> unset _RC_DEBUG _RC_FORCE
> while getopts "df" c; do
>@@ -265,28 +266,28 @@ eval _rctimeout=\${${_name}_timeout}
> # set default values; duplicated in rcctl(8)
> getcap -f /etc/login.conf ${_name} 1>/dev/null 2>&1 && \
>       daemon_class=${_name} || daemon_class=daemon
>-[ -z "${daemon_rtable}" ] && daemon_rtable=0
>-[ -z "${daemon_user}" ] && daemon_user=root
>-[ -z "${daemon_timeout}" ] && daemon_timeout=30
>+[[ -z ${daemon_rtable} ]] && daemon_rtable=0
>+[[ -z ${daemon_user} ]] && daemon_user=root
>+[[ -z ${daemon_timeout} ]] && daemon_timeout=30
> 
> # use flags from the rc.d script if daemon is not enabled
>-[ -n "${_RC_FORCE}" -o "$1" != "start" ] && [ X"${_rcflags}" = X"NO" ]
>&& \
>+[[ -n ${_RC_FORCE} || $1 != start ]] && [[ ${_rcflags} = NO ]] && \
>       unset _rcflags
> 
>-[ -n "${_rcflags}" ] && daemon_flags=${_rcflags}
>-[ -n "${_rcrtable}" ] && daemon_rtable=${_rcrtable}
>-[ -n "${_rcuser}" ] && daemon_user=${_rcuser}
>-[ -n "${_rctimeout}" ] && daemon_timeout=${_rctimeout}
>-
>-if [ -n "${_RC_DEBUG}" ]; then
>-      echo -n "${_name}_flags "
>-      [ -n "${_rcflags}" ] || echo -n "empty, using default "
>-      echo ">${daemon_flags}<"
>+[[ -n ${_rcflags} ]] && daemon_flags=${_rcflags}
>+[[ -n ${_rcrtable} ]] && daemon_rtable=${_rcrtable}
>+[[ -n ${_rcuser} ]] && daemon_user=${_rcuser}
>+[[ -n ${_rctimeout} ]] && daemon_timeout=${_rctimeout}
>+
>+if [[ -n ${_RC_DEBUG} ]]; then
>+      print -n "${_name}_flags "
>+      [[ -n ${_rcflags} ]] || print -n "empty, using default "
>+      print ">${daemon_flags}<"
> fi
> 
> readonly daemon_class
> unset _rcflags _rcrtable _rcuser _rctimeout
> pexp="${daemon}${daemon_flags:+ ${daemon_flags}}"
> rcexec="su -l -c ${daemon_class} -s /bin/sh ${daemon_user} -c"
>-[ "${daemon_rtable}" -eq 0 ] || \
>+[[ ${daemon_rtable} -eq 0 ]] || \
>       rcexec="route -T ${daemon_rtable} exec ${rcexec}"
>Index: etc/rc.d/spamd
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/spamd,v
>retrieving revision 1.7
>diff -u -p -u -r1.7 spamd
>--- etc/rc.d/spamd     15 Jul 2015 13:50:54 -0000      1.7
>+++ etc/rc.d/spamd     5 Sep 2016 03:36:37 -0000
>@@ -10,7 +10,7 @@ pexp="spamd: \[priv\].*"
> rc_reload=NO
> 
> rc_pre() {
>-      [ X"${spamd_black}" != X"NO" ] && \
>+      [[ ${spamd_black} != NO ]] && \
>               daemon_flags="-b ${daemon_flags}"
>       return 0
> }
>@@ -18,7 +18,7 @@ rc_pre() {
> rc_start() {
>       ${rcexec} "${daemon} ${daemon_flags}" || return 1
>       spamd_setup_flags="-D"
>-      [ X"${spamd_black}" != X"NO" ] && \
>+      [[ ${spamd_black} != NO ]] && \
>               spamd_setup_flags="-b ${spamd_setup_flags}"
>       /usr/libexec/spamd-setup ${spamd_setup_flags}
> }
>Index: etc/rc.d/spamlogd
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/spamlogd,v
>retrieving revision 1.2
>diff -u -p -u -r1.2 spamlogd
>--- etc/rc.d/spamlogd  8 Aug 2011 17:13:31 -0000       1.2
>+++ etc/rc.d/spamlogd  5 Sep 2016 03:37:22 -0000
>@@ -9,7 +9,7 @@ daemon="/usr/libexec/spamlogd"
> rc_reload=NO
> 
> rc_pre() {
>-      [  X"${spamd_flags}" != X"NO" -a X"${spamd_black}" = X"NO" ]
>+      [[ ${spamd_flags} != X"NO" && ${spamd_black} = NO ]]
>       if pfctl -si | grep -q Enabled; then
>               ifconfig pflog0 create
>               if ifconfig pflog0; then
>Index: etc/rc.d/ypbind
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/ypbind,v
>retrieving revision 1.5
>diff -u -p -u -r1.5 ypbind
>--- etc/rc.d/ypbind    18 Oct 2015 03:51:11 -0000      1.5
>+++ etc/rc.d/ypbind    5 Sep 2016 03:31:40 -0000
>@@ -10,7 +10,7 @@ rc_bg=YES
> rc_reload=NO
> 
> rc_pre() {
>-      [ X"`domainname`" != X"" ]
>+      [[ -n $(domainname) ]]
> }
> 
> rc_post() {
>Index: etc/rc.d/yppasswdd
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/yppasswdd,v
>retrieving revision 1.4
>diff -u -p -u -r1.4 yppasswdd
>--- etc/rc.d/yppasswdd 8 Jul 2011 04:29:54 -0000       1.4
>+++ etc/rc.d/yppasswdd 5 Sep 2016 03:33:16 -0000
>@@ -9,20 +9,20 @@ daemon="/usr/sbin/rpc.yppasswdd"
> rc_reload=NO
> 
> rc_pre() {
>-      [ X"`domainname`" != X"" -a -d /var/yp/`domainname` ] || \
>+      [[ -n $(domainname) && -d /var/yp/$(domainname) ]] || \
>               return 1
>       _host1=`ypwhich -m passwd 2> /dev/null`
>       _host2=`hostname`
>-      if [ `grep '^lookup' /etc/resolv.conf | grep yp | wc -c` -ne 0 ];
>then
>+      if [[ `grep '^lookup' /etc/resolv.conf | grep yp | wc -c` -ne 0 ]];
>then
>               _host1=`ypmatch $_host1 hosts | cut -d' ' -f2`
>               _host2=`ypmatch $_host2 hosts | cut -d' ' -f2 | head -1`
>       else
>-              _host1=`echo $_host1 | nslookup | grep '^Name: ' | \
>+              _host1=`print $_host1 | nslookup | grep '^Name: ' | \
>                       sed -e 's/^Name:    //'`
>-              _host2=`echo $_host2 | nslookup | grep '^Name: ' | \
>+              _host2=`print $_host2 | nslookup | grep '^Name: ' | \
>                       sed -e 's/^Name:    //'`
>       fi
>-      [ "$_host2" = "$_host1" ]
>+      [[ $_host2 = $_host1 ]]
> }
> 
> rc_cmd $1
>Index: etc/rc.d/ypserv
>===================================================================
>RCS file: /open/anoncvs/cvs/src/etc/rc.d/ypserv,v
>retrieving revision 1.4
>diff -u -p -u -r1.4 ypserv
>--- etc/rc.d/ypserv    6 Oct 2011 06:47:50 -0000       1.4
>+++ etc/rc.d/ypserv    5 Sep 2016 02:17:52 -0000
>@@ -7,7 +7,7 @@ daemon="/usr/sbin/ypserv"
> . /etc/rc.d/rc.subr
> 
> rc_pre() {
>-      [ X"`domainname`" != X"" -a -d /var/yp/`domainname` ]
>+      [[ -n $(domainname) && -d /var/yp/$(domainname) ]]
> }
> 
> rc_cmd $1
>Index: usr.sbin/rcctl/rcctl.sh
>===================================================================
>RCS file: /open/anoncvs/cvs/src/usr.sbin/rcctl/rcctl.sh,v
>retrieving revision 1.104
>diff -u -p -u -r1.104 rcctl.sh
>--- usr.sbin/rcctl/rcctl.sh    30 Jul 2016 06:25:21 -0000      1.104
>+++ usr.sbin/rcctl/rcctl.sh    5 Sep 2016 03:55:04 -0000
>@@ -28,7 +28,7 @@ _rc_parse_conf
> usage()
> {
>       local _a _i
>-      for _i in ${_rc_actions}; do _a="$(echo -n ${_i}${_a:+|${_a}})"; done
>+      for _i in ${_rc_actions}; do _a="$(print -n ${_i}${_a:+|${_a}})";
>done
> 
>       _rc_err \
>       "usage: rcctl get|getdef|set service | daemon [variable [arguments]]
>@@ -39,7 +39,7 @@ usage()
> 
> needs_root()
> {
>-      [ "$(id -u)" -ne 0 ] && _rc_err "${0##*/}: \"$*\" needs root
>privileges"
>+      [[ $(id -u) = 0 ]] || _rc_err "${0##*/}: \"$*\" needs root
>privileges"
> }
> 
> rcctl_err()
>@@ -54,21 +54,21 @@ ls_rcscripts()
>       cd /etc/rc.d && set -- *
>       for _s; do
>               [[ ${_s} = *.* ]] && continue
>-              [ ! -d "${_s}" ] && echo "${_s}"
>+              [[ ! -d "${_s}" ]] && print "${_s}"
>       done
> }
> 
> pkg_scripts_append()
> {
>       local _svc=$1
>-      [ -n "${_svc}" ] || return
>+      [[ -n ${_svc} ]] || return
> 
>       rcconf_edit_begin
>-      if [ -z "${pkg_scripts}" ]; then
>-              echo pkg_scripts="${_svc}" >>${_TMP_RCCONF}
>-      elif ! echo ${pkg_scripts} | grep -qw -- ${_svc}; then
>+      if [[ -z ${pkg_scripts} ]]; then
>+              print pkg_scripts="${_svc}" >>${_TMP_RCCONF}
>+      elif ! print ${pkg_scripts} | grep -qw -- ${_svc}; then
>               grep -v "^pkg_scripts.*=" /etc/rc.conf.local >${_TMP_RCCONF}
>-              echo pkg_scripts="${pkg_scripts} ${_svc}" >>${_TMP_RCCONF}
>+              print pkg_scripts="${pkg_scripts} ${_svc}" >>${_TMP_RCCONF}
>       fi
>       rcconf_edit_end
> }
>@@ -76,7 +76,7 @@ pkg_scripts_append()
> pkg_scripts_order()
> {
>       local _svcs="$*"
>-      [ -n "${_svcs}" ] || return
>+      [[ -n ${_svcs} ]] || return
> 
>       needs_root ${action}
>       local _pkg_scripts _svc
>@@ -87,20 +87,20 @@ pkg_scripts_order()
>                       rcctl_err "${_svc} is not enabled"
>               fi
>       done
>-      _pkg_scripts=$(echo "${_svcs} ${pkg_scripts}" | tr "[:blank:]" "\n" |
>\
>+      _pkg_scripts=$(print "${_svcs} ${pkg_scripts}" | tr "[:blank:]" "\n"
>| \
>                    awk -v ORS=' ' '!x[$0]++')
>       rcconf_edit_begin
>       grep -v "^pkg_scripts.*=" /etc/rc.conf.local >${_TMP_RCCONF}
>-      echo pkg_scripts=${_pkg_scripts} >>${_TMP_RCCONF}
>+      print pkg_scripts=${_pkg_scripts} >>${_TMP_RCCONF}
>       rcconf_edit_end
> }
> 
> pkg_scripts_rm()
> {
>       local _svc=$1
>-      [ -n "${_svc}" ] || return
>+      [[ -n ${_svc} ]] || return
> 
>-      [ -z "${pkg_scripts}" ] && return
>+      [[ -z ${pkg_scripts} ]] && return
> 
>       rcconf_edit_begin
>       sed "/^pkg_scripts[[:>:]]/{s/[[:<:]]${_svc}[[:>:]]//g
>@@ -113,7 +113,7 @@ rcconf_edit_begin()
> {
>       _TMP_RCCONF=$(mktemp -p /etc -t rc.conf.local.XXXXXXXXXX) || \
>               rcctl_err "cannot create temporary file under /etc"
>-      if [ -f /etc/rc.conf.local ]; then
>+      if [[ -f /etc/rc.conf.local ]]; then
>               cat /etc/rc.conf.local >${_TMP_RCCONF} || \
>                       rcctl_err "cannot append to ${_TMP_RCCONF}"
>       else
>@@ -128,7 +128,7 @@ rcconf_edit_end()
>               rcctl_err "cannot modify ${_TMP_RCCONF}"
>       cat ${_TMP_RCCONF} >/etc/rc.conf.local || \
>               rcctl_err "cannot append to /etc/rc.conf.local"
>-      if [ ! -s /etc/rc.conf.local ]; then
>+      if [[ ! -s /etc/rc.conf.local ]]; then
>               rm /etc/rc.conf.local || \
>                       rcctl_err "cannot remove /etc/rc.conf.local"
>       fi
>@@ -139,21 +139,21 @@ rcconf_edit_end()
> svc_is_avail()
> {
>       local _svc=$1
>-      [ -n "${_svc}" ] || return
>+      [[ -n ${_svc} ]] || return
> 
>-      [ -x "/etc/rc.d/${_svc}" ] && return
>+      [[ -x /etc/rc.d/${_svc} ]] && return
>       svc_is_special ${_svc}
> }
> 
> svc_is_base()
> {
>       local _svc=$1
>-      [ -n "${_svc}" ] || return
>+      [[ -n ${_svc} ]] || return
> 
>       local _cached _ret
> 
>-      _cached=$(eval echo \${cached_svc_is_base_${_svc}})
>-      [ "${_cached}" ] && return "${_cached}"
>+      _cached=$(eval print \${cached_svc_is_base_${_svc}})
>+      [[ -n ${_cached} ]] && return "${_cached}"
> 
>       grep -qw "^${_svc}_flags" /etc/rc.conf
>       _ret=$?
>@@ -165,14 +165,14 @@ svc_is_base()
> svc_is_meta()
> {
>       local _svc=$1
>-      [ -n "${_svc}" ] || return
>+      [[ -n ${_svc} ]] || return
> 
>       local _cached _ret
> 
>-      _cached=$(eval echo \${cached_svc_is_meta_${_svc}})
>-      [ "${_cached}" ] && return "${_cached}"
>+      _cached=$(eval print \${cached_svc_is_meta_${_svc}})
>+      [[ -n ${_cached} ]] && return "${_cached}"
> 
>-      [ -r "/etc/rc.d/${_svc}" ] && ! grep -qw "^rc_cmd" /etc/rc.d/${_svc}
>+      [[ -r /etc/rc.d/${_svc} ]] && ! grep -qw "^rc_cmd" /etc/rc.d/${_svc}
>       _ret=$?
> 
>       set -A cached_svc_is_meta_${_svc} -- ${_ret}
>@@ -182,14 +182,14 @@ svc_is_meta()
> svc_is_special()
> {
>       local _svc=$1
>-      [ -n "${_svc}" ] || return
>+      [[ -n ${_svc} ]] || return
> 
>       local _cached _ret
> 
>-      _cached=$(eval echo \${cached_svc_is_special_${_svc}})
>-      [ "${_cached}" ] && return "${_cached}"
>+      _cached=$(eval print \${cached_svc_is_special_${_svc}})
>+      [[ -n ${_cached} ]] && return "${_cached}"
> 
>-      echo ${_special_svcs} | grep -qw -- ${_svc}
>+      print ${_special_svcs} | grep -qw -- ${_svc}
>       _ret=$?
> 
>       set -A cached_svc_is_special_${_svc} -- ${_ret}
>@@ -199,7 +199,7 @@ svc_is_special()
> svc_ls()
> {
>       local _lsarg=$1
>-      [ -n "${_lsarg}" ] || return
>+      [[ -n ${_lsarg} ]] || return
> 
>       # we do not want to return the "status" nor the rc.d(8) script retcode
>       local _ret=0 _on _svc _started
>@@ -208,31 +208,31 @@ svc_ls()
>               all)
>                       (
>                               ls_rcscripts
>-                              echo ${_special_svcs} | tr "[:blank:]" "\n"
>+                              print ${_special_svcs} | tr "[:blank:]" "\n"
>                       ) | sort
>                       ;;
>               failed)
>                       for _svc in $(svc_ls on); do
>                               ! svc_is_special ${_svc} && \
>                                       ! /etc/rc.d/${_svc} check >/dev/null && 
> \
>-                                      echo ${_svc} && _ret=1
>+                                      print ${_svc} && _ret=1
>                       done
>                       ;;
>               off|on)
>                       for _svc in $(svc_ls all); do
>                               svc_get ${_svc} status && _on=1
>-                                      [ "${_lsarg}" = "on" -a -n "${_on}" ] 
>|| \
>-                                              [ "${_lsarg}" = "off" -a -z 
>"${_on}" ] && \
>-                                      echo ${_svc}
>+                                      [[ ${_lsarg} = on && -n ${_on} ]] || \
>+                                              [[ ${_lsarg} = off && -z ${_on} 
>]] && \
>+                                      print ${_svc}
>                               unset _on
>                       done
>                       ;;
>               started|stopped)
>                       for _svc in $(ls_rcscripts); do
>                               /etc/rc.d/${_svc} check >/dev/null && _started=1
>-                              [ "${_lsarg}" = "started" -a -n "${_started}" ] 
>|| \
>-                                      [ "${_lsarg}" = "stopped" -a -z 
>"${_started}" ] && \
>-                                      echo ${_svc}
>+                              [[ ${_lsarg} = started && -n ${_started} ]] || \
>+                                      [[ ${_lsarg} = stopped && -z 
>${_started} ]] && \
>+                                      print ${_svc}
>                               unset _started
>                       done
>                       ;;
>@@ -246,72 +246,72 @@ svc_ls()
> svc_get()
> {
>       local _svc=$1
>-      [ -n "${_svc}" ] || return
>+      [[ -n ${_svc} ]] || return
> 
>       local _status=0 _val _var=$2
>       local daemon_class daemon_flags daemon_rtable daemon_timeout
>daemon_user
> 
>       if svc_is_special ${_svc}; then
>-              daemon_flags="$(eval echo \${${_svc}})"
>+              daemon_flags="$(eval print \${${_svc}})"
>       else
>               # set pkg daemon_flags to "NO" to match base svc
>               if ! svc_is_base ${_svc}; then
>-                      if ! echo ${pkg_scripts} | grep -qw -- ${_svc}; then
>+                      if ! print ${pkg_scripts} | grep -qw -- ${_svc}; then
>                               daemon_flags="NO"
>                       fi
>               fi
> 
>               if ! svc_is_meta ${_svc}; then
>                       # these are expensive, make sure they are explicitely 
> requested
>-                      if [ -z "${_var}" -o "${_var}" = "class" ]; then
>+                      if [[ -z ${_var} || ${_var} = class ]]; then
>                               getcap -f /etc/login.conf ${_svc} 1>/dev/null 
> 2>&1 && \
>                                       daemon_class=${_svc}
>-                              [ -z "${daemon_class}" ] && \
>+                              [[ -z ${daemon_class} ]] && \
>                                       daemon_class="$(svc_getdef ${_svc} 
> class)"
>                       fi
>                       if [[ -z ${_var} || ${_var} == @(flags|status) ]]; then
>-                              [ -z "${daemon_flags}" ] && \
>-                                      daemon_flags="$(eval echo 
>\"\${${_svc}_flags}\")"
>-                              [ -z "${daemon_flags}" ] && \
>+                              [[ -z ${daemon_flags} ]] && \
>+                                      daemon_flags="$(eval print 
>\"\${${_svc}_flags}\")"
>+                              [[ -z ${daemon_flags} ]] && \
>                                       daemon_flags="$(svc_getdef ${_svc} 
> flags)"
>                       fi
>-                      if [ -z "${_var}" -o "${_var}" = "rtable" ]; then
>-                              [ -z "${daemon_rtable}" ] && \
>-                                      daemon_rtable="$(eval echo 
>\"\${${_svc}_rtable}\")"
>-                              [ -z "${daemon_rtable}" ] && \
>+                      if [[ -z ${_var} || ${_var} = rtable ]]; then
>+                              [[ -z ${daemon_rtable} ]] && \
>+                                      daemon_rtable="$(eval print 
>\"\${${_svc}_rtable}\")"
>+                              [[ -z ${daemon_rtable} ]] && \
>                                       daemon_rtable="$(svc_getdef ${_svc} 
> rtable)"
>                       fi
>-                      if [ -z "${_var}" -o "${_var}" = "timeout" ]; then
>-                              [ -z "${daemon_timeout}" ] && \
>-                                      daemon_timeout="$(eval echo 
>\"\${${_svc}_timeout}\")"
>-                              [ -z "${daemon_timeout}" ] && \
>+                      if [[ -z ${_var} || ${_var} = timeout ]]; then
>+                              [[ -z ${daemon_timeout} ]] && \
>+                                      daemon_timeout="$(eval print 
>\"\${${_svc}_timeout}\")"
>+                              [[ -z ${daemon_timeout} ]] && \
>                                       daemon_timeout="$(svc_getdef ${_svc} 
> timeout)"
>                       fi
>-                      if [ -z "${_var}" -o "${_var}" = "user" ]; then
>-                              [ -z "${daemon_user}" ] && \
>-                                      daemon_user="$(eval echo 
>\"\${${_svc}_user}\")"
>-                              [ -z "${daemon_user}" ] && \
>+                      if [[ -z ${_var} || ${_var} = user ]]; then
>+                              [[ -z ${daemon_user} ]] && \
>+                                      daemon_user="$(eval print 
>\"\${${_svc}_user}\")"
>+                              [[ -z ${daemon_user} ]] && \
>                                       daemon_user="$(svc_getdef ${_svc} user)"
>                       fi
>               fi
>       fi
> 
>-      [ "${daemon_flags}" = "NO" ] && _status=1
>+      [[ ${daemon_flags} = NO ]] && _status=1
> 
>-      if [ -n "${_var}" ]; then
>-              [ "${_var}" = "status" ] && return ${_status}
>+      if [[ -n ${_var} ]]; then
>+              [[ ${_var} = status ]] && return ${_status}
>               eval _val=\${daemon_${_var}}
>-              [ -z "${_val}" ] || print -r -- "${_val}"
>+              [[ -z ${_val} ]] || print -r -- "${_val}"
>       else
>               svc_is_meta ${_svc} && return ${_status}
>               if svc_is_special ${_svc}; then
>-                      echo "${_svc}=${daemon_flags}"
>+                      print "${_svc}=${daemon_flags}"
>               else
>-                      echo "${_svc}_class=${daemon_class}"
>-                      echo "${_svc}_flags=${daemon_flags}"
>-                      echo "${_svc}_rtable=${daemon_rtable}"
>-                      echo "${_svc}_timeout=${daemon_timeout}"
>-                      echo "${_svc}_user=${daemon_user}"
>+                      print "${_svc}_class=${daemon_class}"
>+                      print "${_svc}_flags=${daemon_flags}"
>+                      print "${_svc}_rtable=${daemon_rtable}"
>+                      print "${_svc}_timeout=${daemon_timeout}"
>+                      print "${_svc}_user=${daemon_user}"
>               fi
>               return ${_status}
>       fi
>@@ -321,7 +321,7 @@ svc_get()
> svc_getdef()
> {
>       local _svc=$1
>-      [ -n "${_svc}" ] || return
>+      [[ -n ${_svc} ]] || return
> 
>       local _status=0 _val _var=$2
>       local daemon_class daemon_flags daemon_rtable daemon_timeout
>daemon_user
>@@ -329,8 +329,8 @@ svc_getdef()
>       if svc_is_special ${_svc}; then
>               # unconditionally parse: we always output flags and/or status
>               _rc_parse_conf /etc/rc.conf
>-              daemon_flags="$(eval echo \${${_svc}})"
>-              [ "${daemon_flags}" = "NO" ] && _status=1
>+              daemon_flags="$(eval print \${${_svc}})"
>+              [[ ${daemon_flags} = NO ]] && _status=1
>       else
>               if ! svc_is_base ${_svc}; then
>                       _status=1 # all pkg_scripts are off by default
>@@ -340,7 +340,8 @@ svc_getdef()
>                       # we'll get our default flags from the rc.d script
>                       [[ -z ${_var} || ${_var} == status ]] && \
>                               _rc_parse_conf /etc/rc.conf
>-                      [ "$(eval echo \${${_svc}_flags})" = "NO" ] && _status=1
>+                      [[ "$(eval print \${${_svc}_flags})" = NO ]] && \
>+                              _status=1
>               fi
> 
>               if ! svc_is_meta ${_svc}; then
>@@ -348,26 +349,26 @@ svc_getdef()
>                       . /etc/rc.d/${_svc} >/dev/null 2>&1
> 
>                       daemon_class=daemon
>-                      [ -z "${daemon_rtable}" ] && daemon_rtable=0
>-                      [ -z "${daemon_timeout}" ] && daemon_timeout=30
>-                      [ -z "${daemon_user}" ] && daemon_user=root
>+                      [[ -z ${daemon_rtable} ]] && daemon_rtable=0
>+                      [[ -z ${daemon_timeout} ]] && daemon_timeout=30
>+                      [[ -z ${daemon_user} ]] && daemon_user=root
>               fi
>       fi
> 
>-      if [ -n "${_var}" ]; then
>-              [ "${_var}" = "status" ] && return ${_status}
>+      if [[ -n ${_var} ]]; then
>+              [[ ${_var} = status ]] && return ${_status}
>               eval _val=\${daemon_${_var}}
>-              [ -z "${_val}" ] || print -r -- "${_val}"
>+              [[ -z ${_val} ]] || print -r -- "${_val}"
>       else
>               svc_is_meta ${_svc} && return ${_status}
>               if svc_is_special ${_svc}; then
>-                      echo "${_svc}=${daemon_flags}"
>+                      print "${_svc}=${daemon_flags}"
>               else
>-                      echo "${_svc}_class=${daemon_class}"
>-                      echo "${_svc}_flags=${daemon_flags}"
>-                      echo "${_svc}_rtable=${daemon_rtable}"
>-                      echo "${_svc}_timeout=${daemon_timeout}"
>-                      echo "${_svc}_user=${daemon_user}"
>+                      print "${_svc}_class=${daemon_class}"
>+                      print "${_svc}_flags=${daemon_flags}"
>+                      print "${_svc}_rtable=${daemon_rtable}"
>+                      print "${_svc}_timeout=${daemon_timeout}"
>+                      print "${_svc}_user=${daemon_user}"
>               fi
>               return ${_status}
>       fi
>@@ -376,18 +377,18 @@ svc_getdef()
> svc_rm()
> {
>       local _svc=$1
>-      [ -n "${_svc}" ] || return
>+      [[ -n ${_svc} ]] || return
> 
>       rcconf_edit_begin
>       if svc_is_special ${_svc}; then
>               grep -v "^${_svc}.*=" /etc/rc.conf.local >${_TMP_RCCONF}
>               ( svc_getdef ${_svc} status ) && \
>-                      echo "${_svc}=NO" >>${_TMP_RCCONF}
>+                      print "${_svc}=NO" >>${_TMP_RCCONF}
>       else
>               grep -Ev "^${_svc}_(flags|rtable|timeout|user).*=" \
>                       /etc/rc.conf.local >${_TMP_RCCONF}
>               ( svc_getdef ${_svc} status ) && \
>-                      echo "${_svc}_flags=NO" >>${_TMP_RCCONF}
>+                      print "${_svc}_flags=NO" >>${_TMP_RCCONF}
>       fi
>       rcconf_edit_end
> }
>@@ -395,7 +396,7 @@ svc_rm()
> svc_set()
> {
>       local _svc=$1 _var=$2
>-      [ -n "${_svc}" -a -n "${_var}" ] || return
>+      [[ -n ${_svc} && -n ${_var} ]] || return
> 
>       shift 2
>       local _args="$*"
>@@ -403,16 +404,16 @@ svc_set()
>       # don't check if we are already enabled or disabled because rc.conf(8)
>       # defaults may have changed in which case we may have a matching
>       # redundant entry in rc.conf.local that we can drop
>-      if [ "${_var}" = "status" ]; then
>-              if [ "${_args}" = "on" ]; then
>+      if [[ ${_var} = status ]]; then
>+              if [[ ${_args} = on ]]; then
>                       _var="flags"
>                       # keep our flags if we're already enabled
>                       eval "_args=\"\${${_svc}_${_var}}\""
>-                      [ "${_args}" = "NO" ] && unset _args
>+                      [[ ${_args} = NO ]] && unset _args
>                       if ! svc_is_base ${_svc} && ! svc_is_special ${_svc}; 
> then
>                               pkg_scripts_append ${_svc}
>                       fi
>-              elif [ "${_args}" = "off" ]; then
>+              elif [[ ${_args} = off ]]; then
>                       if ! svc_is_base ${_svc} && ! svc_is_special ${_svc}; 
> then
>                               pkg_scripts_rm ${_svc}
>                       fi
>@@ -427,44 +428,44 @@ svc_set()
>       fi
> 
>       if svc_is_special ${_svc}; then
>-              [ "${_var}" = "flags" ] || return
>+              [[ ${_var} = flags ]] || return
>               rcconf_edit_begin
>               grep -v "^${_svc}.*=" /etc/rc.conf.local >${_TMP_RCCONF}
>               ( svc_getdef ${_svc} status ) || \
>-                      echo "${_svc}=YES" >>${_TMP_RCCONF}
>+                      print "${_svc}=YES" >>${_TMP_RCCONF}
>               rcconf_edit_end
>               return
>       fi
> 
>-      if [ -n "${_args}" ]; then
>-              if [ "${_var}" = "rtable" ]; then
>+      if [[ -n ${_args} ]]; then
>+              if [[ ${_var} = rtable ]]; then
>                       [[ ${_args} != +([[:digit:]]) || ${_args} -lt 0 ]] && \
>                               rcctl_err "\"${_args}\" is not an integer"
>               fi
>-              if [ "${_var}" = "timeout" ]; then
>+              if [[ ${_var} = timeout ]]; then
>                       [[ ${_args} != +([[:digit:]]) || ${_args} -le 0 ]] && \
>                               rcctl_err "\"${_args}\" is not a positive 
> integer"
>               fi
>-              if [ "${_var}" = "user" ]; then
>+              if [[ ${_var} = user ]]; then
>                       getent passwd "${_args}" >/dev/null || \
>                               rcctl_err "user \"${_args}\" does not exist"
>               fi
>               # unset flags if they match the default enabled ones
>-              [ "${_args}" = "$(svc_getdef ${_svc} ${_var})" ] && \
>+              [[ ${_args} = "$(svc_getdef ${_svc} ${_var})" ]] && \
>                       unset _args
>       fi
> 
>       # protect leading whitespace
>-      [ "${_args}" = "${_args# }" ] || _args="\"${_args}\""
>+      [[ ${_args} = "${_args# }" ]] || _args="\"${_args}\""
> 
>       # reset: value may have changed
>       unset ${_svc}_${_var}
> 
>       rcconf_edit_begin
>       grep -v "^${_svc}_${_var}.*=" /etc/rc.conf.local >${_TMP_RCCONF}
>-      if [ -n "${_args}" ] || \
>-         ( svc_is_base ${_svc} && ! svc_getdef ${_svc} status && [
>"${_var}" == "flags" ] ); then
>-              echo "${_svc}_${_var}=${_args}" >>${_TMP_RCCONF}
>+      if [[ -n ${_args} ]] || \
>+         ( svc_is_base ${_svc} && ! svc_getdef ${_svc} status && [[ ${_var}
>== flags ]] ); then
>+              print "${_svc}_${_var}=${_args}" >>${_TMP_RCCONF}
>       fi
>       rcconf_edit_end
> }
>@@ -478,7 +479,7 @@ while getopts "df" c; do
>       esac
> done
> shift $((OPTIND-1))
>-[ $# -gt 0 ] || usage
>+[[ $# > 0 ]] || usage
> 
> action=$1
> ret=0
>@@ -499,9 +500,9 @@ case ${action} in
>       disable|enable|start|stop|restart|reload|check)
>               shift 1
>               svcs="$*"
>-              [ -z "${svcs}" ] && usage
>+              [[ -z ${svcs} ]] && usage
>               # it's ok to disable a non-existing daemon
>-              if [ "${action}" != "disable" ]; then
>+              if [[ ${action} != disable ]]; then
>                       for svc in ${svcs}; do
>                               svc_is_avail ${svc} || \
>                                       rcctl_err "service ${svc} does not 
> exist" 2
>@@ -511,14 +512,14 @@ case ${action} in
>       get|getdef)
>               svc=$2
>               var=$3
>-              [ -z "${svc}" ] && usage
>-              [ "${svc}" = "all" ] || svc_is_avail ${svc} || \
>+              [[ -z ${svc} ]] && usage
>+              [[ ${svc} = all ]] || svc_is_avail ${svc} || \
>                       rcctl_err "service ${svc} does not exist" 2
>-              if [ -n "${var}" ]; then
>-                      [ "${svc}" = "all" ] && usage
>+              if [[ -n ${var} ]]; then
>+                      [[ ${svc} = all ]] && usage
>                       [[ ${var} != @(class|flags|status|rtable|timeout|user) 
> ]] && usage
>                       if svc_is_meta ${svc}; then
>-                              [ "${var}" != "status" ] && \
>+                              [[ ${var} != status ]] && \
>                                       rcctl_err "/etc/rc.d/${svc} is a meta 
> script, cannot \"${action}
>${var}\""
>                       fi
>                       if svc_is_special ${svc}; then
>@@ -530,16 +531,16 @@ case ${action} in
>       set)
>               svc=$2
>               var=$3
>-              [ $# -ge 3 ] && shift 3 || shift $#
>+              [[ $# > 3 ]] && shift 3 || shift $#
>               args="$*"
>-              [ -z "${svc}" ] && usage
>+              [[ -z ${svc} ]] && usage
>               # it's ok to disable a non-existing daemon
>-              if [ "${action} ${var} ${args}" != "set status off" ]; then
>+              if [[ "${action} ${var} ${args}" != "set status off" ]]; then
>                       svc_is_avail ${svc} || \
>                               rcctl_err "service ${svc} does not exist" 2
>               fi
>               [[ ${var} != @(class|flags|rtable|status|timeout|user) ]] && 
> usage
>-              svc_is_meta ${svc} && [ "${var}" != "status" ] && \
>+              svc_is_meta ${svc} && [[ ${var} != status ]] && \
>                       rcctl_err "/etc/rc.d/${svc} is a meta script, cannot 
> \"${action}
>${var}\""
>               [[ ${var} = flags && ${args} = NO ]] && \
>                       rcctl_err "\"flags NO\" contradicts \"${action}\""
>@@ -571,7 +572,7 @@ case ${action} in
>               exit ${ret}
>               ;;
>       get|getdef)
>-              if [ "${svc}" = "all" ]; then
>+              if [[ ${svc} = all ]]; then
>                       for svc in $(svc_ls all); do
>                               ( svc_${action} ${svc} "${var}" )
>                       done
>@@ -586,11 +587,11 @@ case ${action} in
>               svc_ls ${lsarg}
>               ;;
>       order)
>-              if [ -n "${svcs}" ]; then
>+              if [[ -n ${svcs} ]]; then
>                       needs_root ${action}
>                       pkg_scripts_order ${svcs}
>               else
>-                      [[ -z ${pkg_scripts} ]] || echo ${pkg_scripts}
>+                      [[ -z ${pkg_scripts} ]] || print ${pkg_scripts}
>               fi
>               ;;
>       set)

Reply via email to