Make rc scripts use [[ instead of [

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Make rc scripts use [[ instead of [

Anthony Coulter
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.

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.

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 ]] .

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.

The rcctl script also has a lot of lines like:
        daemon_timeout="$(svc_getdef ${_svc} timeout)"
I think the quotation marks are unnecessary but the original author
went to a lot of trouble to escape internal quotes, e.g.
        daemon_flags="$(eval print \"\${${_svc}_flags}\")"
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.

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 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.

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.


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 | Threaded
Open this post in threaded view
|

Re: Make rc scripts use [[ instead of [

lists-2
Mon, 5 Sep 2016 07:24:17 -0400 (EDT) Anthony Coulter
<[hidden email]>
> 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.
>
[...]
> 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.

Hi Anthony,

This appears to be one incorrect assumption.  According the ksh(1) manual
page "set command can be used to set (-) or clear (+) shell options", and
"sh - Enable strict Bourne shell mode.."  This makes the original comment
for set +o sh correct, it clears the sh (strict Bourne shell mode) I also
insist, you double checked your other proposals with the manuals as well.

> 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.

This also makes the proposals pretty unset, testing code paths is critical
for start-up and other rc scripts that we must trust do what is expected..
The fact that one particular system still boots is not "good enough here".

Kind regards,
Anton

Reply | Threaded
Open this post in threaded view
|

Re: Make rc scripts use [[ instead of [

ludovic coues
2016-09-05 20:11 GMT+02:00  <[hidden email]>:
> The fact that one particular system still boots is not "good enough here".
>
> Kind regards,
> Anton
>

That's why he share his work. So other people can try on other system.

--

Cordialement, Coues Ludovic
+336 148 743 42

Reply | Threaded
Open this post in threaded view
|

Re: Make rc scripts use [[ instead of [

Jeremie Courreges-Anglas-2
In reply to this post by Anthony Coulter

Hi,

Anthony Coulter <[hidden email]> writes:

> 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.

You don't explain why `print' is more efficient than `echo'.

> 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.
>
> Switching from [ to [[ makes a lot of things more readable; most of
> the improvements result from removing unnecessary quotation marks.

I'm not sure I see how it makes things more readable; less bytes on the
screen?  Most contexts where variables are involved should use quotes
anyway.  So I am not sure this is a good thing in the end.

> 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 ]] .

This is not related to quote removals.  AFAIK ksh handles [ "$foo" = Yes ]
properly, the "X"s aren't necessary.  They were probably added because
of horror stories about ancient shells.

> 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.

FWIW I can't see why removing the quotes would break anything here.

> The rcctl script also has a lot of lines like:
> daemon_timeout="$(svc_getdef ${_svc} timeout)"
> I think the quotation marks are unnecessary but the original author
> went to a lot of trouble to escape internal quotes, e.g.
> daemon_flags="$(eval print \"\${${_svc}_flags}\")"

The "internal" quotes are escaped so that they are still present after
the `eval' pass, not because the whole command substitution itself is
surrounded by double quotes.

var='a    b'; eval print "\$var"; eval print \"\$var\"

> 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.

While I prefer using $() in my scripts, this looks like needless
churn.  The diff doesn't simplify a single instance of nested ``-style
command substitutions.

> Regarding numeric changes: in ksh, [[ 0 -eq 00 ]] is true (numeric
> comparison) but [[ 0 = 00 ]] is false (string comparison). The latter
> is more readable,

This sounds like a personal preference.  I prefer to use numeric
operators when dealing with numbers.

> 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 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.

Nope, ''set -o sh'' sets strict mode on, ''set +o sh'' disables it.

[...]

--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply | Threaded
Open this post in threaded view
|

Re: Make rc scripts use [[ instead of [

Anthony Coulter
In reply to this post by Anthony Coulter
> You don't explain why `print' is more efficient than `echo'.

Short answer: I'm an idiot who didn't realize that `echo' and `[' are
shell builtins. The only parts of my change that still seem worthwhile
to me now are the ones related to the awkward X-comparisons, but there
are few enough of those and they're handled in an idiomatic way, so I'm
not going to bother pushing it. Anybody who has real work to do can
stop reading the email now. The advantage of continuing to read is that
you get some insight into the psychology of a naive user.

Long answer (written partly in a pointless attempt to save face, and
partly to show appreciation to Jeremie's non-condescending response to
what turned out to be a stupid suggestion):

While I vaguely remember reading long ago that `echo' and `[' were
shell builtins, I'm much more strongly aware that /bin/echo and /bin/[
are also available as separate executables. Their man pages don't
mention that they have builtin ksh implementations, and I'm very aware
that `[[' parses arguments differently from `[', e.g.

        $ foo="two words"
        $ [[ $foo = "two words" ]] && echo True || echo False
        True
        $ [ $foo = "two words" ] && echo True || echo False
        ksh: [: words: unexpected operator/operand
        False

which I interpreted as further evidence that `[' and `[[' were
fundamentally different in implementation. Of course, this is wrong,
as "type [" and "type echo" prove. And I remember now that /bin/echo
and /bin/[ are available as separate executables for POSIX reasons,
and that their man pages don't cover the behavior of ksh because they
*aren't* ksh. The point of all of this is that I made an assumption
that seemed reasonable and while I checked some things in the manual,
there were some things I didn't even think to check because they seemed
so obvious. Oops. That happened in another way:

> Nope, ''set -o sh'' sets strict mode on, ''set +o sh'' disables it.
I checked to make sure that "sh" stood for strict mode and not
unstrict mode (since I couldn't understand how that comment could be
so flagrantly wrong), but it never occurred to me to check that `-'
enables something and `+' disables it. Oops again.

In any event, my main goal was to keep us from spawning needless
processes, and my first draft of the change was pretty much just
replacing `[' with `[[' and `echo' with `print.' But since I already
had to change things like [ "$foo" ] to [[ -n "$foo" ]] it seemed
wasteful not to take advantage of the improved argument-parsing of the
`[[' operator and remove the quotation marks, to get [[ -n $foo ]].
But if I'm doing it in some places, I should do it in all places. So
a lot of quotation marks went away to take advantage of the improved
parsing characteristics of `[['.

Some of my other "readability improvements" felt a little awkward and I
couldn't find any reference to shell scripts in style(9) (which I *did*
check before mailing in the proposed change), so I was careful to make
them only in places where I was already breaking stuff. Replacing ``
with $() was an example of that---I left backticks in place in yppasswdd
when I didn't already have a "legitimate" reason to touch the line, and
then I made a point to state explicitly what I had done to see if anyone
would comment on it. Which you did. (I won't try to rationalize my
change to numeric comparisons, since as you say it was a personal
preference, and it was also fairly dubious.)

There's one more specific point I want to make while I'm here about
the awkward X-comparisons: if you search for the phrase "A common
mistake" in the ksh manual, you'll find an example of a comparison
that fails when a variable is unset. Oddly, it only works when the
"if" keyword is used; the "[ foo ] && do_something" construct does not
have any problems.

So, this is the last you'll hear from me on this proposal---it was a
bad idea from the start, and if I had typed "whence -v [" from the
beginning I wouldn't have bothered. But overall I think my
misunderstanding was reasonable, and my "needless churn" would have
been better-received if the underlying reason for the change had been
valid.

And finally, I would again like to thank you (Jeremie) for a thorough
and non-condescending response to a stupid idea. You assumed that I was
sensible enough to read your reviewi and taught me something about the
quote behavior of the eval operator---I hope this (otherwise pointless)
email validates your faith that not all people with stupid ideas are
themselves stupid. And sometimes we read the man pages and we still
miss important things!

Regards,
Anthony

Reply | Threaded
Open this post in threaded view
|

Re: Make rc scripts use [[ instead of [

Alexander Hall
In reply to this post by Anthony Coulter
Ok, so I'll throw in my view too.

On September 5, 2016 1:24:17 PM GMT+02:00, Anthony Coulter <[hidden email]> 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 | Threaded
Open this post in threaded view
|

Re: Make rc scripts use [[ instead of [

Jason McIntyre-2
In reply to this post by Anthony Coulter
On Mon, Sep 05, 2016 at 04:39:49PM -0400, Anthony Coulter wrote:
>
> While I vaguely remember reading long ago that `echo' and `[' were
> shell builtins, I'm much more strongly aware that /bin/echo and /bin/[
> are also available as separate executables. Their man pages don't
> mention that they have builtin ksh implementations, and I'm very aware
> that `[[' parses arguments differently from `[', e.g.
>

hi.

any commands which have shell builtin equivalents do make note of this,
in the STANDARDS section of the relevant man page.

jmc