makewhatis
来自「OTP是开放电信平台的简称」· 代码 · 共 327 行
TXT
327 行
#!/bin/sh# makewhatis: create the whatis database# Created: Sun Jun 14 10:49:37 1992# Revised: Sat Jan 8 14:12:37 1994 by faith@cs.unc.edu# Revised: Sat Mar 23 17:56:18 1996 by micheal@actrix.gen.nz# Copyright 1992, 1993, 1994 Rickard E. Faith (faith@cs.unc.edu)# May be freely distributed and modified as long as copyright is retained.## Wed Dec 23 13:27:50 1992: Rik Faith (faith@cs.unc.edu) applied changes# based on Mitchum DSouza (mitchum.dsouza@mrc-apu.cam.ac.uk) cat patches.# Also, cleaned up code and make it work with NET-2 doc pages.## makewhatis-1.4: aeb 940802, 941007, 950417# Fixed so that the -c option works correctly for the cat pages# on my machine. Fix for -u by Nan Zou (nan@ksu.ksu.edu).# Many minor changes.# The -s option is undocumented, and may well disappear again.## Sat Mar 23 1996: Michael Hamilton (michael@actrix.gen.nz).# I changed the script to invoke gawk only once for each directory tree.# This speeds things up considerably (from 30 minutes down to 1.5 minutes# on my 486DX66).# 960401 - aeb: slight adaptation to work correctly with cat pages.# 960510 - added fixes by brennan@raven.ca.boeing.com, author of mawk.# 971012 - replaced "test -z" - it doesnt work on SunOS 4.1.3_U1.# 980710 - be more careful with TMPFILE## Note for Slackware users: "makewhatis -v -w -c" will work.PATH=/usr/bin:/binDEFMANPATH=/usr/manDEFCATPATH=/usr/man/preformat:/usr/man# Find a place for our temporary files. If security is not a concern, use# TMPFILE=/tmp/whatis$$; TMPFILEDIR=none# Of course makewhatis should only have the required permissions# (for reading and writing directories like /usr/man).# We try here to be careful (and avoid preconstructed symlinks)# in case makewhatis is run as root, by creating a subdirectory of /tmp.# If that fails we use $HOME.# The code below uses test -O which doesnt work on all systems.TMPFILE=$HOME/whatis$$TMPFILEDIR=/tmp/whatis$$if [ ! -d $TMPFILEDIR ]; then mkdir $TMPFILEDIR chmod 0700 $TMPFILEDIR if [ -O $TMPFILEDIR ]; then TMPFILE=$TMPFILEDIR/w fifitopath=manpathdefmanpath=$DEFMANPATHdefcatpath=sections="1 2 3 4 5 6 7 8 9 n l"for name in $*doif [ -n "$setsections" ]; then setsections= sections=$name continueficase $name in -c) topath=catpath defmanpath= defcatpath=$DEFCATPATH continue;; -s) setsections=1 continue;; -u) findarg="-ctime 0" update=1 continue;; -v) verbose=1 continue;; -w) manpath=`man --path` continue;; -*) echo "Usage: makewhatis [-u] [-v] [-w] [manpath] [-c [catpath]]" echo " This will build the whatis database for the man pages" echo " found in manpath and the cat pages found in catpath." echo " -u: update database with new pages" echo " -v: verbose" echo " -w: use manpath obtained from \`man --path\`" echo " [manpath]: man directories (default: $DEFMANPATH)" echo " [catpath]: cat directories (default: the first existing" echo " directory in $DEFCATPATH)" exit;; *) if [ -d $name ] then eval $topath="\$$topath":$name else echo "No such directory $name" exit fi;;esacdonemanpath=`echo ${manpath-$defmanpath} | tr : ' '`if [ x"$catpath" = x ]; then for d in `echo $defcatpath | tr : ' '` do if [ -d $d ]; then catpath=$d; break; fi doneficatpath=`echo ${catpath} | tr : ' '`# first truncate all the whatis files that will be created new,# then only update - we might visit the same directory twiceif [ x$update = x ]; then for pages in man cat do eval path="\$$pages"path for mandir in $path do cp /dev/null $mandir/whatis done donefifor pages in man catdo export pages eval path="\$$pages"path for mandir in $path do if [ x$verbose != x ]; then echo "about to enter $mandir" > /dev/tty fi if [ -s ${mandir}/whatis -a $pages = man ]; then if [ x$verbose != x ]; then echo skipping $mandir - we did it already > /dev/tty fi else here=`pwd` cd $mandir for i in $sections do if [ -d ${pages}$i ] then cd ${pages}$i section=$i export section verbose find . -name '*' $findarg -print | /usr/bin/gawk ' function readline() { if (use_zcat) { result = (pipe_cmd | getline); if (result < 0) { print "Pipe error: " pipe_cmd " " ERRNO > "/dev/stderr"; } } else { result = (getline < filename); if (result < 0) { print "Read file error: " filename " " ERRNO > "/dev/stderr"; } } return result; } function closeline() { if (use_zcat) { return close(pipe_cmd); } else { return close(filename); } } function do_one() { after = 0; insh = 0; thisjoin = 1; charct = 0; if (verbose) { print "adding " filename > "/dev/tty" } use_zcat = (filename ~ /\.Z$/ || filename ~ /\.z$/ || filename ~ /\.gz$/); match(filename, "/[^/]+$"); progname = substr(filename, RSTART + 1, RLENGTH - 1); if (match(progname, "\\." section "[A-Za-z]+")) { actual_section = substr(progname, RSTART + 1, RLENGTH - 1); } else { actual_section = section; } sub(/\..*/, "", progname); if (use_zcat) { pipe_cmd = "zcat " filename; } while (readline() > 0) { gsub(/.\b/, ""); if (($1 ~ /^\.[Ss][Hh]/ && $2 ~ /[Nn][Aa][Mm][Ee]/) || (pages == "cat" && $1 ~ /^NAME/)) { if (!insh) insh = 1; else { printf "\n"; closeline(); return; } } else if (insh) { if ($1 ~ /^\.[Ss][HhYS]/ || (pages == "cat" && ($1 ~ /^S[yYeE]/ || $1 ~ /^DESCRIPTION/ || $1 ~ /^COMMAND/ || $1 ~ /^OVERVIEW/ || $1 ~ /^STRUCTURES/ || $1 ~ /^INTRODUCTION/))) { # end insh for Synopsis, Syntax, but also for # DESCRIPTION (e.g., XFree86.1x), # COMMAND (e.g., xspread.1) # OVERVIEW (e.g., TclCommandWriting.3) # STRUCTURES (e.g., XEvent.3x) # INTRODUCTION (e.g., TclX.n) printf "\n"; closeline(); return; } else { # derived from Tom Christiansen perl script if (!after && $0 ~ progname"-") { # Fix old cat pages sub(progname"-", progname" - "); } gsub(/ /, " "); # Translate tabs to spaces gsub(/ +/, " "); # Collapse spaces gsub(/ *, */, ", "); # Fix comma spacings sub(/^ /, ""); # Kill initial spaces sub(/ $/, ""); # Kill trailing spaces sub(/__+/, "_"); # Collapse underscores if ($0 ~ /[^ ]-$/) { sub(/-$/, ""); # Handle Hyphenations nextjoin = 1; } else nextjoin = 0; sub(/^.[IB] /, ""); # Kill bold and italics sub(/^.Nm /, ""); # Kill bold sub(/^.Tn /, ""); # Kill normal sub(/^.Li /, ""); # Kill .Li sub(/^.Dq /, ""); # Kill .Dq sub(/^.Nd */, "- "); # Convert .Nd to dash gsub(/\\f[PRIB0123]/, ""); # Kill font changes gsub(/\\s[-+0-9]*/, ""); # Kill size changes gsub(/\\&/, ""); # Kill \& gsub(/\\\((ru|ul)/, "_"); # Translate gsub(/\\\((mi|hy|em)/, "-"); # Translate gsub(/\\\*\(../, ""); # Kill troff strings sub(/^\.\\\".*/, ""); # Kill comments gsub(/\\/, ""); # Kill all backslashes if ($1 ~ /^\.../ || $1 == "") { if (after && !needmore) { printf "\n"; thisjoin = 1; charct = 0; after = 0; } } else { if ($0 ~ /^- /) { sub("- ", " - "); } else if (!thisjoin && $0 !~ /^- /) { printf " "; charct += 1; } thisjoin = nextjoin; if ($0 !~ / - / && $0 !~ / -$/ && $0 !~ /^- /) { printf "%s", $0; charct += length(); needmore = 0; } else { after = 1 if ($0 ~ / - /) { where = match( $0 , / - /); } else if ($0 ~ / -$/) { where = match( $0, / -$/); } else { where = 1; } if ((width = 20-charct) < 0) width=0 printf "%-*s", width, sprintf( "%s (%s)", substr( $0, 1, where-1 ), actual_section ); printf "%s", substr( $0, where ) if ($0 ~ /- *$/) { needmore = 1; } else { needmore = 0; } } } } } } closeline(); } { # Main action - process each filename read in. filename = $0; do_one(); } ' pages=$pages section=$section verbose=$verbose cd .. fi done > $TMPFILE cd $here # kludge for Slackware's /usr/man/preformat if [ $mandir = /usr/man/preformat ] then mandir1=/usr/man else mandir1=$mandir fi if [ -f ${mandir1}/whatis ] then cat ${mandir1}/whatis >> $TMPFILE fi sed '/^$/d' < $TMPFILE | sort | uniq > ${mandir1}/whatis chmod 644 ${mandir1}/whatis rm $TMPFILE fi donedone# remove the dir if we created itif [ $TMPFILE = $TMPFILEDIR/w ]; then rmdir $TMPFILEDIRfi
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?