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