1*8462SApril.Chin@Sun.COM#!/usr/bin/ksh93 2*8462SApril.Chin@Sun.COM 3*8462SApril.Chin@Sun.COM# 4*8462SApril.Chin@Sun.COM# CDDL HEADER START 5*8462SApril.Chin@Sun.COM# 6*8462SApril.Chin@Sun.COM# The contents of this file are subject to the terms of the 7*8462SApril.Chin@Sun.COM# Common Development and Distribution License (the "License"). 8*8462SApril.Chin@Sun.COM# You may not use this file except in compliance with the License. 9*8462SApril.Chin@Sun.COM# 10*8462SApril.Chin@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 11*8462SApril.Chin@Sun.COM# or http://www.opensolaris.org/os/licensing. 12*8462SApril.Chin@Sun.COM# See the License for the specific language governing permissions 13*8462SApril.Chin@Sun.COM# and limitations under the License. 14*8462SApril.Chin@Sun.COM# 15*8462SApril.Chin@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each 16*8462SApril.Chin@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 17*8462SApril.Chin@Sun.COM# If applicable, add the following below this CDDL HEADER, with the 18*8462SApril.Chin@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying 19*8462SApril.Chin@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner] 20*8462SApril.Chin@Sun.COM# 21*8462SApril.Chin@Sun.COM# CDDL HEADER END 22*8462SApril.Chin@Sun.COM# 23*8462SApril.Chin@Sun.COM 24*8462SApril.Chin@Sun.COM# 25*8462SApril.Chin@Sun.COM# Copyright 2008 Sun Microsystems, Inc. All rights reserved. 26*8462SApril.Chin@Sun.COM# Use is subject to license terms. 27*8462SApril.Chin@Sun.COM# 28*8462SApril.Chin@Sun.COM 29*8462SApril.Chin@Sun.COM# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant 30*8462SApril.Chin@Sun.COMexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin 31*8462SApril.Chin@Sun.COM 32*8462SApril.Chin@Sun.COM# Make sure all math stuff runs in the "C" locale to avoid problems 33*8462SApril.Chin@Sun.COM# with alternative # radix point representations (e.g. ',' instead of 34*8462SApril.Chin@Sun.COM# '.' in de_DE.*-locales). This needs to be set _before_ any 35*8462SApril.Chin@Sun.COM# floating-point constants are defined in this script). 36*8462SApril.Chin@Sun.COMif [[ "${LC_ALL}" != "" ]] ; then 37*8462SApril.Chin@Sun.COM export \ 38*8462SApril.Chin@Sun.COM LC_MONETARY="${LC_ALL}" \ 39*8462SApril.Chin@Sun.COM LC_MESSAGES="${LC_ALL}" \ 40*8462SApril.Chin@Sun.COM LC_COLLATE="${LC_ALL}" \ 41*8462SApril.Chin@Sun.COM LC_CTYPE="${LC_ALL}" 42*8462SApril.Chin@Sun.COM unset LC_ALL 43*8462SApril.Chin@Sun.COMfi 44*8462SApril.Chin@Sun.COMexport LC_NUMERIC=C 45*8462SApril.Chin@Sun.COM 46*8462SApril.Chin@Sun.COMfunction fatal_error 47*8462SApril.Chin@Sun.COM{ 48*8462SApril.Chin@Sun.COM print -u2 "${progname}: $*" 49*8462SApril.Chin@Sun.COM exit 1 50*8462SApril.Chin@Sun.COM} 51*8462SApril.Chin@Sun.COM 52*8462SApril.Chin@Sun.COMfunction debug_print 53*8462SApril.Chin@Sun.COM{ 54*8462SApril.Chin@Sun.COM # don't use "--" here to allow "-f" for formatting 55*8462SApril.Chin@Sun.COM# print -u2 "$@" 56*8462SApril.Chin@Sun.COM return 0 57*8462SApril.Chin@Sun.COM} 58*8462SApril.Chin@Sun.COM 59*8462SApril.Chin@Sun.COM# Build a list of compound variables calculated from MANPATH and 60*8462SApril.Chin@Sun.COM# locale which contain... 61*8462SApril.Chin@Sun.COM# "manpath_element" - the MANPATH element this entry belongs to 62*8462SApril.Chin@Sun.COM# "dir" - physical directory of "manpath_element" 63*8462SApril.Chin@Sun.COM# "sect" - section (if "manpath_element" is something like /usr/share/man,1b) 64*8462SApril.Chin@Sun.COM# ... and put the result in the array named by argv[1] 65*8462SApril.Chin@Sun.COMfunction enumerate_mandirs 66*8462SApril.Chin@Sun.COM{ 67*8462SApril.Chin@Sun.COM nameref md=$1 68*8462SApril.Chin@Sun.COM typeset manpath_element dir sect manlang 69*8462SApril.Chin@Sun.COM integer i=0 70*8462SApril.Chin@Sun.COM 71*8462SApril.Chin@Sun.COM if [[ "${LC_MESSAGES}" != "" ]] ; then 72*8462SApril.Chin@Sun.COM manlang="${LC_MESSAGES}" 73*8462SApril.Chin@Sun.COM else 74*8462SApril.Chin@Sun.COM manlang="${LANG}" 75*8462SApril.Chin@Sun.COM fi 76*8462SApril.Chin@Sun.COM 77*8462SApril.Chin@Sun.COM print -r -- "${MANPATH//:/$'\n'}" | while read manpath_element ; do 78*8462SApril.Chin@Sun.COM # strip section from manpath elements like "/usr/share/man,1b" 79*8462SApril.Chin@Sun.COM dir="${manpath_element/~(E)(.*),(.*)/\1}" 80*8462SApril.Chin@Sun.COM sect="${manpath_element/~(E)(.*),(.*)/\2}" 81*8462SApril.Chin@Sun.COM [[ "${sect}" == "${dir}" ]] && sect="" 82*8462SApril.Chin@Sun.COM 83*8462SApril.Chin@Sun.COM if [[ "${manlang}" != "" && -d "${dir}/${manlang}" ]] ; then 84*8462SApril.Chin@Sun.COM md+=( 85*8462SApril.Chin@Sun.COM manpath_element="${manpath_element}" 86*8462SApril.Chin@Sun.COM dir="${dir}/${manlang}" 87*8462SApril.Chin@Sun.COM sect="${sect}" 88*8462SApril.Chin@Sun.COM ) 89*8462SApril.Chin@Sun.COM fi 90*8462SApril.Chin@Sun.COM if [[ -d "${dir}" ]] ; then 91*8462SApril.Chin@Sun.COM md+=( 92*8462SApril.Chin@Sun.COM manpath_element="${manpath_element}" 93*8462SApril.Chin@Sun.COM dir="${dir}" 94*8462SApril.Chin@Sun.COM sect="${sect}" 95*8462SApril.Chin@Sun.COM ) 96*8462SApril.Chin@Sun.COM fi 97*8462SApril.Chin@Sun.COM done 98*8462SApril.Chin@Sun.COM 99*8462SApril.Chin@Sun.COM return 0 100*8462SApril.Chin@Sun.COM} 101*8462SApril.Chin@Sun.COM 102*8462SApril.Chin@Sun.COMfunction enumerate_mansects 103*8462SApril.Chin@Sun.COM{ 104*8462SApril.Chin@Sun.COM nameref ms=$1 105*8462SApril.Chin@Sun.COM nameref mandir_node=$2 106*8462SApril.Chin@Sun.COM typeset mancf="${mandir_node.dir}/man.cf" 107*8462SApril.Chin@Sun.COM typeset x s l 108*8462SApril.Chin@Sun.COM 109*8462SApril.Chin@Sun.COM if [[ "${mandir_node.sect}" != "" ]] ; then 110*8462SApril.Chin@Sun.COM x="${mandir_node.sect}" 111*8462SApril.Chin@Sun.COM elif [[ "${MANSECTS}" != "" ]] ; then 112*8462SApril.Chin@Sun.COM x="${MANSECTS//,/$'\n'}" 113*8462SApril.Chin@Sun.COM elif [[ -f "${mancf}" && -r "${mancf}" ]] ; then 114*8462SApril.Chin@Sun.COM x="$(egrep -v '^#|^[[:space:]]*$' <"${mancf}" | egrep '^MANSECTS=')" 115*8462SApril.Chin@Sun.COM x="${x/MANSECTS=}/" 116*8462SApril.Chin@Sun.COM x="${x//,/$'\n'}" 117*8462SApril.Chin@Sun.COM else 118*8462SApril.Chin@Sun.COM x="$(cd "${mandir_node.dir}" ; \ 119*8462SApril.Chin@Sun.COM ls -1d ~(El)(sman|man).*/ | \ 120*8462SApril.Chin@Sun.COM while read s ; do \ 121*8462SApril.Chin@Sun.COM s="${s/~(El)(sman|man)/}" ; \ 122*8462SApril.Chin@Sun.COM s="${s/~(Er)\//}" ; \ 123*8462SApril.Chin@Sun.COM print -r -- "$s" ; \ 124*8462SApril.Chin@Sun.COM done)" 125*8462SApril.Chin@Sun.COM fi 126*8462SApril.Chin@Sun.COM 127*8462SApril.Chin@Sun.COM while read l ; do 128*8462SApril.Chin@Sun.COM [[ "${l}" != ~(Elr)[[:blank:]]* ]] && ms+=( "${l}" ) 129*8462SApril.Chin@Sun.COM# print -- "sect=$l" 130*8462SApril.Chin@Sun.COM done <<<"${x}" 131*8462SApril.Chin@Sun.COM 132*8462SApril.Chin@Sun.COM# printf "enumerate_mansects: found %d entries.\n" ${#ms[@]} 133*8462SApril.Chin@Sun.COM 134*8462SApril.Chin@Sun.COM return 0 135*8462SApril.Chin@Sun.COM} 136*8462SApril.Chin@Sun.COM 137*8462SApril.Chin@Sun.COM# wrapper around more/less 138*8462SApril.Chin@Sun.COMfunction browse_manpage 139*8462SApril.Chin@Sun.COM{ 140*8462SApril.Chin@Sun.COM typeset tmpdirname 141*8462SApril.Chin@Sun.COM typeset doc_filename="$1" 142*8462SApril.Chin@Sun.COM typeset doc_title="$2" 143*8462SApril.Chin@Sun.COM 144*8462SApril.Chin@Sun.COM # squish characters in filename which are not allowed in a filesystem 145*8462SApril.Chin@Sun.COM # (currently '/') 146*8462SApril.Chin@Sun.COM doc_title="${doc_title//\//}" 147*8462SApril.Chin@Sun.COM 148*8462SApril.Chin@Sun.COM # check if we have "less" installed, if not fall back to /usr/xpg4/bin/more 149*8462SApril.Chin@Sun.COM if which less >/dev/null 2>&1 ; then 150*8462SApril.Chin@Sun.COM # use "cat" here to avoid that "less" may try funny things 151*8462SApril.Chin@Sun.COM cat <"${doc_filename}" | less -I -M $"--prompt=MManual\ page\ ${doc_title}\ ?ltline\ %lt?L/%L.:" 152*8462SApril.Chin@Sun.COM else 153*8462SApril.Chin@Sun.COM tmpdirname="$(mktemp -d "/tmp/shman_${PPID}_$$_XXXXXX")" 154*8462SApril.Chin@Sun.COM 155*8462SApril.Chin@Sun.COM mkdir -p "${tmpdirname}" || { print -u2 -f $"Couldn't create tmp. dir %s\n" "${tmpdirname}" ; return 1 ; } 156*8462SApril.Chin@Sun.COM 157*8462SApril.Chin@Sun.COM ( 158*8462SApril.Chin@Sun.COM cd "${tmpdirname}" 159*8462SApril.Chin@Sun.COM 160*8462SApril.Chin@Sun.COM # note: we need to support /dev/stdin 161*8462SApril.Chin@Sun.COM cat <"${doc_filename}" >"./${doc_title}" 162*8462SApril.Chin@Sun.COM 163*8462SApril.Chin@Sun.COM /usr/xpg4/bin/more "${doc_title}" 164*8462SApril.Chin@Sun.COM 165*8462SApril.Chin@Sun.COM rm -f "${doc_title}" 166*8462SApril.Chin@Sun.COM ) 167*8462SApril.Chin@Sun.COM 168*8462SApril.Chin@Sun.COM rmdir "${tmpdirname}" 169*8462SApril.Chin@Sun.COM fi 170*8462SApril.Chin@Sun.COM 171*8462SApril.Chin@Sun.COM return 0 172*8462SApril.Chin@Sun.COM} 173*8462SApril.Chin@Sun.COM 174*8462SApril.Chin@Sun.COM# /usr/bin/man <keyword> 175*8462SApril.Chin@Sun.COMfunction show_manpage 176*8462SApril.Chin@Sun.COM{ 177*8462SApril.Chin@Sun.COM typeset -a -C mandirs 178*8462SApril.Chin@Sun.COM integer i 179*8462SApril.Chin@Sun.COM integer j 180*8462SApril.Chin@Sun.COM 181*8462SApril.Chin@Sun.COM enumerate_mandirs mandirs 182*8462SApril.Chin@Sun.COM# debug_print -- "${mandirs[@]}" 183*8462SApril.Chin@Sun.COM 184*8462SApril.Chin@Sun.COM integer num_mandirs=${#mandirs[@]} 185*8462SApril.Chin@Sun.COM 186*8462SApril.Chin@Sun.COM for ((i=0 ; i < num_mandirs ; i++ )) ; do 187*8462SApril.Chin@Sun.COM typeset mandir="${mandirs[i].dir}" 188*8462SApril.Chin@Sun.COM 189*8462SApril.Chin@Sun.COM typeset -a mansects 190*8462SApril.Chin@Sun.COM enumerate_mansects mansects "mandirs[$i]" 191*8462SApril.Chin@Sun.COM 192*8462SApril.Chin@Sun.COM integer num_mansects="${#mansects[@]}" 193*8462SApril.Chin@Sun.COM# debug_print -- "mansects=${mansects[@]}" 194*8462SApril.Chin@Sun.COM 195*8462SApril.Chin@Sun.COM for ((j=0 ; j < num_mansects ; j++ )) ; do 196*8462SApril.Chin@Sun.COM typeset mansect="${mansects[j]}" 197*8462SApril.Chin@Sun.COM 198*8462SApril.Chin@Sun.COM # try 1: SGML manpage 199*8462SApril.Chin@Sun.COM typeset match="${mandir}/sman${mansect}/${manname}.${mansect}" 200*8462SApril.Chin@Sun.COM if [[ -r "${match}" ]] ; then 201*8462SApril.Chin@Sun.COM typeset note nlink 202*8462SApril.Chin@Sun.COM 203*8462SApril.Chin@Sun.COM # follow SGML links if needed (needs rework, including protection against link loops) 204*8462SApril.Chin@Sun.COM while true ; do 205*8462SApril.Chin@Sun.COM debug_print -f "match: %s\n" "${match}" 206*8462SApril.Chin@Sun.COM 207*8462SApril.Chin@Sun.COM tmp="$(cd "${mandir}" ; LC_MESSAGES=C /usr/lib/sgml/sgml2roff "${match}")" 208*8462SApril.Chin@Sun.COM read note nlink <<<"${tmp}" 209*8462SApril.Chin@Sun.COM 210*8462SApril.Chin@Sun.COM if [[ "${note}" == ".so" ]] ; then 211*8462SApril.Chin@Sun.COM match="${nlink}" 212*8462SApril.Chin@Sun.COM else 213*8462SApril.Chin@Sun.COM break 214*8462SApril.Chin@Sun.COM fi 215*8462SApril.Chin@Sun.COM done 216*8462SApril.Chin@Sun.COM 217*8462SApril.Chin@Sun.COM tbl <<<"${tmp}" | eqn | nroff -u0 -Tlp -man - | col -x | browse_manpage /dev/stdin "${manname}(${mansect})" 218*8462SApril.Chin@Sun.COM return 0 219*8462SApril.Chin@Sun.COM fi 220*8462SApril.Chin@Sun.COM 221*8462SApril.Chin@Sun.COM # try 2: troff manpage 222*8462SApril.Chin@Sun.COM match="${mandir}/man${mansect}/${manname}.${mansect}" 223*8462SApril.Chin@Sun.COM if [[ -r "${match}" ]] ; then 224*8462SApril.Chin@Sun.COM debug_print -f "match: %s\n" "${match}" 225*8462SApril.Chin@Sun.COM tbl <"${match}" | eqn | nroff -u0 -Tlp -man - | col -x | browse_manpage /dev/stdin "${manname}(${mansect})" 226*8462SApril.Chin@Sun.COM return 0 227*8462SApril.Chin@Sun.COM fi 228*8462SApril.Chin@Sun.COM done 229*8462SApril.Chin@Sun.COM unset mansects num_mansects 230*8462SApril.Chin@Sun.COM done 231*8462SApril.Chin@Sun.COM 232*8462SApril.Chin@Sun.COM printf $"No manual entry for %s.\n" "${manname}" 233*8462SApril.Chin@Sun.COM return 0 234*8462SApril.Chin@Sun.COM} 235*8462SApril.Chin@Sun.COM 236*8462SApril.Chin@Sun.COM# /usr/bin/man -l <keyword> 237*8462SApril.Chin@Sun.COMfunction list_manpages 238*8462SApril.Chin@Sun.COM{ 239*8462SApril.Chin@Sun.COM typeset -a -C mandirs 240*8462SApril.Chin@Sun.COM 241*8462SApril.Chin@Sun.COM enumerate_mandirs mandirs 242*8462SApril.Chin@Sun.COM #debug_print -- "${mandirs[@]}" 243*8462SApril.Chin@Sun.COM 244*8462SApril.Chin@Sun.COM integer num_mandirs=${#mandirs[@]} 245*8462SApril.Chin@Sun.COM 246*8462SApril.Chin@Sun.COM for ((i=0 ; i < num_mandirs ; i++ )) ; do 247*8462SApril.Chin@Sun.COM typeset mandir="${mandirs[i].dir}" 248*8462SApril.Chin@Sun.COM 249*8462SApril.Chin@Sun.COM typeset -a mansects 250*8462SApril.Chin@Sun.COM enumerate_mansects mansects "mandirs[$i]" 251*8462SApril.Chin@Sun.COM 252*8462SApril.Chin@Sun.COM integer num_mansects="${#mansects[@]}" 253*8462SApril.Chin@Sun.COM# debug_print -- "mansects=${mansects[@]}" 254*8462SApril.Chin@Sun.COM 255*8462SApril.Chin@Sun.COM for ((j=0 ; j < num_mansects ; j++ )) ; do 256*8462SApril.Chin@Sun.COM mansect="${mansects[j]}" 257*8462SApril.Chin@Sun.COM 258*8462SApril.Chin@Sun.COM # try 1: SGML manpage 259*8462SApril.Chin@Sun.COM match="${mandir}/sman${mansect}/${manname}.${mansect}" 260*8462SApril.Chin@Sun.COM if [[ -r "${match}" ]] ; then 261*8462SApril.Chin@Sun.COM printf "%s (%s)\t-M %s\n" "${manname}" "${mansect}" "${mandir}" 262*8462SApril.Chin@Sun.COM continue 263*8462SApril.Chin@Sun.COM fi 264*8462SApril.Chin@Sun.COM 265*8462SApril.Chin@Sun.COM # try 2: troff manpage 266*8462SApril.Chin@Sun.COM match="${mandir}/man${mansect}/${manname}.${mansect}" 267*8462SApril.Chin@Sun.COM if [[ -r "${match}" ]] ; then 268*8462SApril.Chin@Sun.COM printf "%s (%s)\t-M %s\n" "${manname}" "${mansect}" "${mandir}" 269*8462SApril.Chin@Sun.COM continue 270*8462SApril.Chin@Sun.COM fi 271*8462SApril.Chin@Sun.COM done 272*8462SApril.Chin@Sun.COM unset mansects num_mansects 273*8462SApril.Chin@Sun.COM done 274*8462SApril.Chin@Sun.COM 275*8462SApril.Chin@Sun.COM return 0 276*8462SApril.Chin@Sun.COM} 277*8462SApril.Chin@Sun.COM 278*8462SApril.Chin@Sun.COM# /usr/bin/appropos 279*8462SApril.Chin@Sun.COMfunction list_keywords 280*8462SApril.Chin@Sun.COM{ 281*8462SApril.Chin@Sun.COM typeset -a mandirs 282*8462SApril.Chin@Sun.COM typeset name namesec title 283*8462SApril.Chin@Sun.COM 284*8462SApril.Chin@Sun.COM enumerate_mandirs mandirs 285*8462SApril.Chin@Sun.COM #debug_print -- "${mandirs[@]}" 286*8462SApril.Chin@Sun.COM 287*8462SApril.Chin@Sun.COM integer num_mandirs=${#mandirs[@]} 288*8462SApril.Chin@Sun.COM 289*8462SApril.Chin@Sun.COM for ((i=0 ; i < num_mandirs ; i++ )) ; do 290*8462SApril.Chin@Sun.COM typeset mandir="${mandirs[i].dir}" 291*8462SApril.Chin@Sun.COM typeset windexfile="${mandir}/windex" 292*8462SApril.Chin@Sun.COM 293*8462SApril.Chin@Sun.COM if [[ ! -r "${windexfile}" ]] ; then 294*8462SApril.Chin@Sun.COM print -u2 -f $"%s: Can't open %s.\n" "${progname}" "${windexfile}" 295*8462SApril.Chin@Sun.COM continue 296*8462SApril.Chin@Sun.COM fi 297*8462SApril.Chin@Sun.COM 298*8462SApril.Chin@Sun.COM while IFS=$'\t' read name namesec title ; do 299*8462SApril.Chin@Sun.COM if [[ "${name}${namesec}${title}" == ~(Fi)${manname} ]] ; then 300*8462SApril.Chin@Sun.COM printf "%s\t%s\t%s\n" "${name}" "${namesec}" "${title}" 301*8462SApril.Chin@Sun.COM fi 302*8462SApril.Chin@Sun.COM done <"${windexfile}" 303*8462SApril.Chin@Sun.COM done 304*8462SApril.Chin@Sun.COM 305*8462SApril.Chin@Sun.COM return 0 306*8462SApril.Chin@Sun.COM} 307*8462SApril.Chin@Sun.COM 308*8462SApril.Chin@Sun.COMfunction usage 309*8462SApril.Chin@Sun.COM{ 310*8462SApril.Chin@Sun.COM OPTIND=0 311*8462SApril.Chin@Sun.COM getopts -a "${progname}" "${man_usage}" OPT '-?' 312*8462SApril.Chin@Sun.COM exit 2 313*8462SApril.Chin@Sun.COM} 314*8462SApril.Chin@Sun.COM 315*8462SApril.Chin@Sun.COM# program start 316*8462SApril.Chin@Sun.COMbuiltin basename 317*8462SApril.Chin@Sun.COMbuiltin cat 318*8462SApril.Chin@Sun.COMbuiltin date 319*8462SApril.Chin@Sun.COM 320*8462SApril.Chin@Sun.COMtypeset progname="$(basename "${0}")" 321*8462SApril.Chin@Sun.COM 322*8462SApril.Chin@Sun.COMtypeset -r man_usage=$'+ 323*8462SApril.Chin@Sun.COM[-?\n@(#)\$Id: shman (Roland Mainz) 2008-10-14 \$\n] 324*8462SApril.Chin@Sun.COM[-author?Roland Mainz <roland.mainz@nrubsig.org>] 325*8462SApril.Chin@Sun.COM[-author?Roland Mainz <roland.mainz@sun.com>] 326*8462SApril.Chin@Sun.COM[+NAME?man - find and display reference manual pages] 327*8462SApril.Chin@Sun.COM[+DESCRIPTION?The man command displays information from the reference 328*8462SApril.Chin@Sun.COM manuals. It displays complete manual pages that you select 329*8462SApril.Chin@Sun.COM by name, or one-line summaries selected either by keyword 330*8462SApril.Chin@Sun.COM (-k), or by the name of an associated file (-f). If no 331*8462SApril.Chin@Sun.COM manual page is located, man prints an error message.] 332*8462SApril.Chin@Sun.COM[+?write me.] 333*8462SApril.Chin@Sun.COM[k:keyword?Prints out one-line summaries from the windex database (table of contents) that 334*8462SApril.Chin@Sun.COM contain any of the given keywords. The windex database is created using 335*8462SApril.Chin@Sun.COM catman(1M).] 336*8462SApril.Chin@Sun.COM[l:list?Lists all manual pages found matching name within the search path.] 337*8462SApril.Chin@Sun.COM[M:mpath?Specifies an alternate search path for manual pages. path is a colon-separated 338*8462SApril.Chin@Sun.COM list of directories that contain manual page directory subtrees. For example, if 339*8462SApril.Chin@Sun.COM path is /usr/share/man:/usr/local/man, man searches for name in the standard 340*8462SApril.Chin@Sun.COM location, and then /usr/local/man. When used with the -k or -f options, the -M 341*8462SApril.Chin@Sun.COM option must appear first. Each directory in the path is assumed to contain subdirectories of the form man* or sman* , 342*8462SApril.Chin@Sun.COM one for each section. This option overrides the MANPATH environment variable.]:[path] 343*8462SApril.Chin@Sun.COM[s:section?Specifies sections of the manual for man to search. The directories searched for 344*8462SApril.Chin@Sun.COM name are limited to those specified by section. section can be a numerical 345*8462SApril.Chin@Sun.COM digit, perhaps followed by one or more letters to match the desired section of 346*8462SApril.Chin@Sun.COM the manual, for example, "3libucb". Also, section can be a word, for example, 347*8462SApril.Chin@Sun.COM local, new, old, public. section can also be a letter. 348*8462SApril.Chin@Sun.COM To specify multiple sections, separate each section with 349*8462SApril.Chin@Sun.COM a comma. This option overrides the MANPATH environment variable and the man.cf 350*8462SApril.Chin@Sun.COM file. 351*8462SApril.Chin@Sun.COM See Search Path below for an explanation of how man conducts its search.]:[section] 352*8462SApril.Chin@Sun.COM 353*8462SApril.Chin@Sun.COMname 354*8462SApril.Chin@Sun.COM 355*8462SApril.Chin@Sun.COM[+SEE ALSO?\bksh93\b(1), \bman\b(1)] 356*8462SApril.Chin@Sun.COM' 357*8462SApril.Chin@Sun.COM 358*8462SApril.Chin@Sun.COMtypeset do_list=false 359*8462SApril.Chin@Sun.COMtypeset do_keyword=false 360*8462SApril.Chin@Sun.COM 361*8462SApril.Chin@Sun.COMwhile getopts -a "${progname}" "${man_usage}" OPT ; do 362*8462SApril.Chin@Sun.COM# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|" 363*8462SApril.Chin@Sun.COM case ${OPT} in 364*8462SApril.Chin@Sun.COM M) MANPATH="${OPTARG}" ;; 365*8462SApril.Chin@Sun.COM l) do_list=true ;; 366*8462SApril.Chin@Sun.COM k) do_keyword=true ;; 367*8462SApril.Chin@Sun.COM s) MANSECTS="${OPTARG}" ;; 368*8462SApril.Chin@Sun.COM *) usage ;; 369*8462SApril.Chin@Sun.COM esac 370*8462SApril.Chin@Sun.COMdone 371*8462SApril.Chin@Sun.COMshift $((OPTIND-1)) 372*8462SApril.Chin@Sun.COM 373*8462SApril.Chin@Sun.COM# cd /usr/man; LC_MESSAGES=C /usr/lib/sgml/sgml2roff /usr/man/sman1as/asadmin-list-timers.1as | tbl | eqn | nroff -u0 -Tlp -man - | col -x > /tmp/mpLQaqac 374*8462SApril.Chin@Sun.COM 375*8462SApril.Chin@Sun.COMtypeset manname="$1" 376*8462SApril.Chin@Sun.COMdebug_print -f "# searching for %s ...\n" "${manname}" 377*8462SApril.Chin@Sun.COM 378*8462SApril.Chin@Sun.COMif ${do_keyword} ; then 379*8462SApril.Chin@Sun.COM list_keywords 380*8462SApril.Chin@Sun.COMelif ${do_list} ; then 381*8462SApril.Chin@Sun.COM list_manpages 382*8462SApril.Chin@Sun.COMelse 383*8462SApril.Chin@Sun.COM show_manpage 384*8462SApril.Chin@Sun.COMfi 385*8462SApril.Chin@Sun.COM 386*8462SApril.Chin@Sun.COM# todo: better exit codes 387*8462SApril.Chin@Sun.COMexit 0 388*8462SApril.Chin@Sun.COM# EOF. 389