4704 lines
140 KiB
Plaintext
4704 lines
140 KiB
Plaintext
From: Nancy Blachman <decvax!decwrl!sun!idi!resonex!nancy@Ucb-Vax.ARPA>
|
||
To: net.unix, net.unix-wizards, net.sources
|
||
Subject: Actual tricks, shells, csh aliases and the like, 1 of 3
|
||
Date: 16 Oct 84 21:20:53 GMT
|
||
Organization: Resonex Inc., Sunnyvale, CA
|
||
|
||
> [Know anybody with a GREAT .login or .cshrc?]
|
||
|
||
> I'm interested in collecting the little tricks, shell scripts, awk
|
||
> hacks, csh aliases, and such that people have built to make their daily
|
||
> life a little easier or more automatic. Being a fairly new system
|
||
> administrator I don't have the big toolbox that years of messing around
|
||
> will leave you with. If you have any hacks you're proud of (or that
|
||
> you aren't proud of, but which work anyway), and you're willing to make
|
||
> them public, mail them to me. I'll collect, collate, shuffle, sort,
|
||
> munge, judge, select and discard them and then "summarize to the net".
|
||
|
||
This article concentrates on aliases, and .cshrc and .login files I received
|
||
in response to my solicitation. The second article in this series focuses
|
||
shell scripts. The third article centers on C programs and awk scripts.
|
||
|
||
/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/
|
||
> Nancy Blachman {allegra,hplabs,ihnp4,sun}!resonex!nancy (408)720 8600 x37 <
|
||
/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/
|
||
|
||
::::::::::::::
|
||
aliases/1
|
||
::::::::::::::
|
||
Date: Thu, 13 Sep 84 07:27:35 est
|
||
From: ihnp4!pur-ee!davy (Dave Curry)
|
||
To: ihnp4!resonex!nancy
|
||
Subject: aliases
|
||
|
||
Nancy:
|
||
|
||
Here's a few handy aliases to put your current working
|
||
directory into your prompt:
|
||
|
||
alias cd chdir \!:\* \; set prompt='${cwd}\[!\]\ ' \; setenv CWD '$cwd'
|
||
alias pd pushd \!:\* \; set prompt='${cwd}\[!\]\ ' \; setenv CWD '$cwd'
|
||
alias pp popd \!:\* \; set prompt='${cwd}\[!\]\ ' \; setenv CWD '$cwd'
|
||
|
||
These put the current directory into the environment also, this is
|
||
for an editor used here locally which uses this information. You can delete
|
||
that part if you don't need it.
|
||
|
||
--Dave Curry
|
||
ihnp4!pur-ee!davy
|
||
|
||
|
||
|
||
::::::::::::::
|
||
aliases/2
|
||
::::::::::::::
|
||
From: hplabs!sdcrdcf!sdcsvax!greg (Greg Noel)
|
||
Date: Thu, 13 Sep 84 10:57:51 pdt
|
||
Return-Address: ucbvax!sdcsvax!greg or Greg@NOSC
|
||
Organization: NCR Corporation, Torrey Pines
|
||
To: sdcrdcf!hplabs!resonex!nancy
|
||
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like
|
||
|
||
I have three little gems from my bag of tricks that I'd like to show you,
|
||
all for the C shell. The first is an alias for the `pwd' command:
|
||
alias pwd echo \$cwd
|
||
The built-in variable `cwd' always contains the current working directory,
|
||
and since `echo' is a built-in command, this is MUCH faster than invoking
|
||
a program to calculate the actual location. The only problem (and I don't
|
||
have a solution) is that it gets confused by symbolic links to directories.
|
||
|
||
The second one is something that turns the directory structure from something
|
||
passive into something active:
|
||
alias come if -e .greg_come source .greg_come
|
||
alias go if -e .greg_go source .greg_go
|
||
alias cd go \; set prev = \$cwd \; chdir \!\* \; \
|
||
echo \$prev ==\\\> \$cwd \; come
|
||
What this does is cause the shell to look for a specific file whenever it
|
||
transfers into a directory, and if it is there, source it. Also, whenever
|
||
you leave a directory, it looks for a different file and sources that before
|
||
leaving. I use this to set up location-specific aliases or to have something
|
||
happen auto-magicly whenever I work in some diretory -- for example, changing
|
||
into my `play' directory invokes a menu that will set up the environment and
|
||
run game programs -- different save files for `rogue' or other stuff that
|
||
I don't want to carry around with me all the time. It's more flexible than
|
||
it seems at first glance; the only thing I can suggest is to try it and you
|
||
will keep finding new ways to use it.
|
||
|
||
The last one is really a replacement for the `pushd' and `popd' commands --
|
||
I didn't like the way they worked, so I did these. It seperates the action
|
||
of pushing a directory from the action of changing directories. I wanted
|
||
this since I also have a whole bunch of aliases to move between widely-
|
||
seperated portions of the filesystem (something I do a lot) and it was
|
||
easier for me to type `push; u test' (which pushes the current directory
|
||
and takes me into the `test' subdirectory of something interesting) than
|
||
to type `pushd /long/complicated/path/test'. This isn't terribly original,
|
||
but the gem, and something I find VERY useful is the `back' command, which
|
||
takes you to the directory you last left, so you can bouce back and forth
|
||
between two directories -- one is the source location and one the test
|
||
location, for example. Anyway, here's what it looks like:
|
||
alias push set dirstack = \( \$cwd \$dirstack \) \; \
|
||
echo Pushing \\\[\$\#dirstack] \$cwd \; \!\*
|
||
alias pop cd \$dirstack\[1] \; set dirstack = \( \$dirstack\[2-] \)
|
||
alias back set dirstack = \( \$prev \$dirstack \) \; pop
|
||
alias pp set x = \$dirstack\[1] dirstack\[1] = \$cwd \; cd \$x
|
||
Notice that it interacts with the previous alias for `cd' in that it expects
|
||
the variable `prev' to have the previous directory (which is what `cd' leaves
|
||
in it). The `pp' alias is sometimes useful -- it pushes the current directory
|
||
while transfering to the old top of stack, a simultaneous push-pop.
|
||
|
||
I hope you found these interesting and entertaining.
|
||
|
||
-- Greg Noel, NCR Torrey Pines Greg@sdcsvax.UUCP or Greg@nosc.ARPA
|
||
|
||
::::::::::::::
|
||
cshrc/1
|
||
::::::::::::::
|
||
From: <hplabs!tektronix!jerryp>
|
||
Date: Thursday, 13 Sep 84 09:48:55 PDT
|
||
To: resonex!nancy, jerryp
|
||
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like
|
||
|
||
Nancy,
|
||
|
||
I'll mail you a few .cshrc and .login files. Unfortunately, I'm short on
|
||
time... so I can't comment a lot... but I'd be glad to answer any questions
|
||
you've got about how they work.
|
||
|
||
A summary of them:
|
||
|
||
1) This .cshrc file comes from the tektronix!tekred machine in Redmond,
|
||
Oregon. Its neat feature is that, when a user "su"'s to someone else's
|
||
account, their prompt changes
|
||
from %
|
||
to account>
|
||
where the "su"'d name appears before the >. Very nice, I think.
|
||
|
||
Also, they do a standard thing around here. The first line [if ($?prompt)]
|
||
checks to see if the .cshrc is being scanned by an interactive shell. If so,
|
||
the commands below are executed. If not (like a shell escape from "vi"), the
|
||
commands aren't executed. This really speeds up shell escapes! (I do the
|
||
same thing, in a different way, in my .cshrc file.)
|
||
|
||
|
||
2) This is my .login file. I should mention that I've got my own calendar
|
||
system that's updated every morning at 1 AM by "at". It sits in my
|
||
".calendar" directory. You'll see a lot of that stuff in the .login file.
|
||
|
||
|
||
3 & 4) I have *two* .cshrc files. One, ".cshrc", is the standard file. It
|
||
contains a limited list of aliases and setup commands. The other, ".cshrc2",
|
||
is one I source when I'll be logged on for a long time and doing a lot of
|
||
work. The .cshrc2 has time-saving aliases like "alias m more" in it.
|
||
|
||
At login, the .cshrc is always read. This sets my prompt to something like
|
||
<directory,#>
|
||
where # is the C-shell history number. Also, since my system is so busy, I
|
||
have a "quick login" setup in .cshrc to let me see my mail immediately and
|
||
logout without doing anything else, if I want to. This quick-login has a
|
||
$
|
||
prompt set... the Bourne-shell prompt.
|
||
|
||
If I want an extended login, I execute the alias "res" (from .cshrc). It sets
|
||
alarms automatically (for meetings, etc... from my .calendar directory) and
|
||
re-sets my prompt to something like
|
||
[directory,#]
|
||
That way, I know that I've got all my aliases available.
|
||
|
||
Since my system is overloaded, this dual-.cshrc system saves me time and
|
||
hassle... .cshrc2 takes a long time to source.
|
||
|
||
|
||
--Jerry Peek, UNIX Training Instructor, Tektronix, Inc.
|
||
US Mail: MS 76-036, P.O. Box 500, Beaverton, OR 97077
|
||
uucp: {allegra,decvax,hplabs,ihnp4,mit-eddie,ucbvax}!tektronix!jerryp
|
||
CSnet: jerryp@tek
|
||
ARPAnet: jerryp.tek@csnet-relay
|
||
Phone: 503/627-1603
|
||
|
||
|
||
---------------------------------------------------------------------------
|
||
FILE #1 (.cshrc):
|
||
|
||
if ($?prompt) then
|
||
set history=20
|
||
set path=(. $home/bin /usr/local /usr/tek /usr/public /usr/ucb /bin /usr/bin)
|
||
set mail=(300 /usr/spool/mail/$home:t /etc/motd)
|
||
source ~/.aliases
|
||
|
||
set prompt=`whoami | sed -e 's/ .*//' -e 's/user=//'`
|
||
if ($prompt == $user || $prompt == "") then
|
||
set prompt="% "
|
||
else
|
||
set prompt="$prompt> "
|
||
endif
|
||
endif
|
||
---------------------------------------------------------------------------
|
||
FILE #2 (.login):
|
||
uptime # show system load
|
||
set ignoreeof # do not logout on EOF (^D)
|
||
set noclobber # do not overwrite files with > or >>
|
||
cp ~/.exrc8 ~/.exrc # set up vi/ex to environment in ~/.exrc8
|
||
setenv EDIT /usr/ucb/vi # set default editor to vi
|
||
setenv PRINTER uph # if type "man -Tlpr", use "uph" to store for printing
|
||
setenv NEWSBOX ~ # save news (readnews "s") in home directory or beneath
|
||
|
||
set noglob; eval `tset -srQm 'plugboard:?4025'`; unset noglob
|
||
|
||
stty new crt # new tty driver, crt terminal, see newtty(4)
|
||
stty tostop hup # stop background jobs on output, hangup hw on logout
|
||
limit filesize 2000 # do not write file > 2,000,000 bytes
|
||
limit coredumpsize 0 # prevent core dumps when csh bombs
|
||
touch .llog # set correct last login time for finger
|
||
if ($TERM == 'tek4023' || $TERM =~ aaa*inv ) then
|
||
# KEEP more FROM USING THE ul OPTION AND MESSING UP DISPLAY:
|
||
setenv MORE -u
|
||
else if (($TERM == qume5) || ($TERM == dumb)) then
|
||
mesg n
|
||
exit 0
|
||
endif
|
||
|
||
# immediate notification (every 60 seconds) of mail:
|
||
set mail = (60 /usr/spool/mail/$user /etc/motd)
|
||
|
||
# check /etc/motd for changes; if any, show them and (maybe) add to calendar:
|
||
diff ~/.calendar/last.motd /etc/motd >! /tmp/motd.diff
|
||
if ( $status != 0 ) then
|
||
echo "< = old MOTD ... > = new MOTD"
|
||
more /tmp/motd.diff
|
||
echo "To read the new MOTD into the calendar, answer y. To ignore it, answer q."
|
||
echo -n "Otherwise, hit RETURN: "
|
||
set ans = $<
|
||
if ($ans == "y") then
|
||
cat /etc/motd | tee -a ~/.calendar/calendar >! ~/.calendar/last.motd
|
||
vi + ~/.calendar/calendar
|
||
echo "To reset *today's* calendars, type 'calendar.set -F'."
|
||
else if ($ans == "q") then
|
||
cat /etc/motd >! ~/.calendar/last.motd
|
||
endif
|
||
endif
|
||
|
||
echo "--------------------"
|
||
inc # put new mail, if any, in ~/.mail/inbox
|
||
|
||
echo "--------------------"
|
||
|
||
set time = 10 # for jobs that take longer than 10, show how long
|
||
# IF THERE ARE LOGIN MESSAGES, SHOW THEM:
|
||
if !(-z ~/.calendar/mesg.login) then
|
||
echo "Here are the login messages, "`date '+%a %D'`
|
||
echo ""
|
||
doublespace ~/.calendar/mesg.login
|
||
endif
|
||
|
||
echo "For an uptime graph, type 'upgr'."
|
||
---------------------------------------------------------------------------
|
||
FILE #3 (.cshrc):
|
||
# if this is a non-interactive shell, quit.
|
||
if ( ! $?prompt) exit 0
|
||
|
||
# save login system search path, removing leading "." (thanx to tekig!danr):
|
||
if ( ! $?SYSPATH ) setenv SYSPATH "$path[2-]"
|
||
|
||
# set default places to find commands (put current and .bin directories first):
|
||
set path=(. ~/.bin $SYSPATH /usr/public{,/texthelp} /usr3/{barbaraz/.,tcomm/}bin)
|
||
|
||
# CHECK FOR QUICK LOGIN:
|
||
if (! $?LOGGEDIN) then
|
||
echo -n "For quick login (Bourne shell), answer y; otherwise, press RETURN: "
|
||
if ( "$<" =~ y* ) then
|
||
echo "To continue with login, press control-D; to logout, type 'stty 0'"
|
||
/bin/sh -i
|
||
echo "Continuing with standard login..."
|
||
endif
|
||
endif
|
||
setenv LOGGEDIN x
|
||
|
||
# set cd search path for directory names which aren't sub-directories:
|
||
set cdpath=(~ `finddirs ~/training{,/*} /usr3/tcomm/unix{,/*}` ~/.bin ~/.log ~/.mail ~/stuff ~/tape*)
|
||
|
||
set history=1000 # keep the last 1000 commands in history
|
||
|
||
# use /usr/public/prompt to get massaged directory name for prompt-setting:
|
||
set prompt = "<`prompt ~ $cwd`,"{\!}"> "
|
||
|
||
# edit my calendar:
|
||
alias calen 'vi ~/.calendar/calendar; echo '"To reset today\'s calendars, type calendar.set -F"''
|
||
|
||
# change directory, reset prompt:
|
||
alias cd 'chdir \!*; set prompt = "<`prompt ~ $cwd`,"{\!}"> "'
|
||
|
||
# add to specified .log directory
|
||
alias log 'echo "Put a .ze at end of file, unless last log of this set.";vi + ~/.log/`cat ~/.log/latestlog`/\!*'
|
||
|
||
# create newterm command to allow terminal-type change
|
||
alias newterm 'set noglob;eval `tset -srQ \!*`;unset noglob'
|
||
|
||
# sets alarms (if any) and sources '.cshrc2' (my other alias list)
|
||
alias res '~/.bin/alarm.set ; source ~/.cshrc2'
|
||
|
||
alias todo 'vi ~/todo\!*' # change one of the "to do" lists
|
||
---------------------------------------------------------------------------
|
||
FILE #4 (.cshrc2):
|
||
|
||
# notify immediately when background jobs are finished
|
||
set notify
|
||
|
||
# prompt with current directory name, history number:
|
||
alias s_p 'set prompt = "[`prompt ~ $cwd`,"{\!}"] "'
|
||
s_p
|
||
|
||
# set 'vi' for 4-character tabs/shifts:
|
||
alias 4vi 'cp ~/.exrc{4,}; echo "MODE: programming"'
|
||
|
||
# set 'vi' for 8-character tabs/shifts:
|
||
alias 8vi 'cp ~/.exrc{8,}; echo "MODE: text"'
|
||
|
||
# set 'vi' for quick work (no .exrc file):
|
||
alias qvi 'rm ~/.exrc; echo "MODE: quick"'
|
||
|
||
# easy way to compile "C" programs (ring bell if filename ends with ".c"):
|
||
alias C 'if ("\!*" =~ *.c) yes ;mv \!* ,\!*;echo \!*.c" SENT TO cc";cc \!*.c -o \!*;if (-e \!*) chmod 311 \!*'
|
||
|
||
# show alarms that (may be) set... and message explaining them:
|
||
alias alarms 'echo "These alarms have been set:";cat ~/.calendar/mesg.alarm; \ps | fgrep ".bin/nleave"'
|
||
|
||
# change back to previous directory:
|
||
alias c- 'set x=$cwd; chdir $lastdir; s_p; set lastdir=$x'
|
||
|
||
# edit my calendar:
|
||
alias calen 'v8 ~/.calendar/calendar; echo '"To reset today\'s calendars, type calendar.set -F"''
|
||
|
||
# see today's calendars:
|
||
alias cals 'cat ~/.calendar/mesg.*'
|
||
|
||
# save current directory for 'c-', change directory, reset prompt:
|
||
alias cd 'set lastdir=$cwd; chdir \!*; s_p'
|
||
|
||
# see mail without inc'ing it:
|
||
alias checkm 'see /usr/spool/mail/jerryp'
|
||
|
||
# same as 'cd', but lists directory, too:
|
||
alias cl 'set lastdir=$cwd; chdir \!*; ls -F; s_p'
|
||
|
||
# same as 'cl', but gives long list:
|
||
alias cll 'set lastdir=$cwd; chdir \!*; ls -l; s_p'
|
||
|
||
alias f 'grep "^\!*" /etc/passwd' # quick version of "finger -s"
|
||
|
||
alias H 'history -r | fgrep "\!*"' # find something in history list
|
||
alias h history 5 # show last five lines
|
||
alias hi history 10 # show last ten lines
|
||
alias his history 20 # show last twenty lines
|
||
alias hist 'history 40|m' # show last forty lines; pipe to 'more'
|
||
alias histo 'history 70|m' # show last seventy lines; pipe to 'more'
|
||
|
||
# send output of command to 'pr' (with command as header), then to uph:
|
||
alias hpr '\!* | pr -h "\!*" | uph'
|
||
|
||
alias j 'jobs -l >! /tmp/j$$; pushin /tmp/j$$; rm /tmp/j$$'
|
||
# show job status (process numbers, too) squeezed onto one line each
|
||
|
||
alias lc 'ls *.c' # list all C source code in this directory
|
||
|
||
# add to specified .log directory
|
||
alias log 'echo "Put a .ze at end of file, unless last log of this set.";v8 + ~/.log/`cat ~/.log/latestlog`/\!*'
|
||
|
||
# list executable files, 5 columns, sorted across 80-wide line:
|
||
alias lx 'lf -1 | fgrep \* | pr -t -5 -l1 -w80'
|
||
|
||
alias m more # shortened form of 'more' command
|
||
|
||
# faster pwd (singlequotes prevent expansion before it's executed):
|
||
alias pwd 'echo $cwd'
|
||
|
||
# re-start inverse video on Ann Arbors:
|
||
alias reinv 'echo "[7m";clear'
|
||
|
||
# lock terminal until ^C and login password are entered:
|
||
alias somb /usr3/jos/bin/somb
|
||
|
||
alias showm 'inc;show' # get new mail
|
||
|
||
# give more info (how much time I've used) when using "status":
|
||
alias status 'source ~/.bin/status'
|
||
|
||
alias tcpr 'tcprint -p12 -m5 -ff \!* &' # typical quick "tcprint" use
|
||
|
||
alias todo 'v8 ~/todo\!*' # change one of the "to do" lists
|
||
|
||
alias up uptime
|
||
|
||
# make uptime graph:
|
||
alias upgr '(nohup uptime_graph ~/,up`date +%m%d.%H%M` &)'
|
||
|
||
# show uptime today's graph:
|
||
alias upsh 'uptime_show -20 ~/,up`date +%m%d`*'
|
||
|
||
# 'vi' for programming:
|
||
alias v4 '4vi;vi \!*'
|
||
|
||
# 'vi' for standard text:
|
||
alias v8 '8vi;vi \!*'
|
||
|
||
# call 'vi' with a search (must use 8vi because search requires a 'wrapscan')
|
||
alias vs '8vi; vi +/\!*'
|
||
|
||
alias write '/usr4/danr/bin/rite -c \!*' # show each character as it's typed
|
||
|
||
#UNUSED ALIASES:
|
||
#alias cd 'set lastdir=$cwd;chdir \!*;set prompt="`~/.bin/prompt`"'
|
||
# change to maps directory:
|
||
#alias maps 'cd /usr/spool/news/lib/maps;echo "switching to newsa";su newsa;set $user=jerryp;c-'
|
||
# keep "at" job from dying because of long EXINIT:
|
||
#alias niterun 'setenv EXINIT "set sw=8";\niterun \!*;8vi'
|
||
#alias du ~danr/bin/du # improved version of "directory usage" query
|
||
# format text, save in file".ty", then show it on the crt:
|
||
#alias typeup '~/.bin/type \!* >! \!*:r; more \!*:r'
|
||
# give description of 'ps' codes before doing the 'ps':
|
||
#alias ps 'cat ~/.ps.man;\ps \!*'
|
||
# easy way to compile and run "C" programs
|
||
# (ring bell if filename ends with ".c"):
|
||
#alias c 'if ("\!*" =~ *.c) yes ;mv \!* ,\!*;echo \!*.c" SENT TO cc";cc \!*.c -o \!*;echo "press ^C to stop execution";sleep 2;./\!*'
|
||
# easy way to change editor environment files:
|
||
#alias adde 'vi ~/.exrc\!*; set ex=(`cat ~/.exrc\!*`); setenv EXINIT "$ex"'
|
||
#alias rmm '\rmm \!* &' # remove mail in background
|
||
# faster "man" listings:
|
||
#alias man 'echo "man -q:"; \man -q \!*'
|
||
# improved spell routine (write-protected dictionary):
|
||
#alias spel 'chmod +w ~/.misspell; /usr/public/spel \!*;chmod -w ~/.misspell'
|
||
# show whether using ~/.exrc4 or ~/.exrc8:
|
||
#alias vi 'echo "MODE: "$EXSTAT;/usr/ucb/vi \!*'
|
||
#alias comp '8vi;\comp \!*' # set 'vi' for text before doing the 'comp'
|
||
# show last ten users of "tcprint" program:
|
||
#alias tcp tail /usr3/tcomm/.tcprint/log
|
||
# favorite "ps" (gives PID, PPID, STAT, TT, TIME, and long description):
|
||
#alias p 'ps lwx | cut -c12-22,53- | nfold'
|
||
|
||
::::::::::::::
|
||
cshrc/2
|
||
::::::::::::::
|
||
Date: Thu, 13 Sep 84 02:16:31 edt
|
||
From: ihnp4!seismo!umcp-cs!chris (Chris Torek)
|
||
To: ihnp4!resonex!nancy
|
||
Subject: Re: Tricks, shell and awk scripts, ...
|
||
|
||
Actually Re: [Know anybody with a GREAT .login or .cshrc?]:
|
||
|
||
I don't know about *great*, but I'm probably one of the candidates for
|
||
*slowest* . . . . FYA (For Your Amusement), here's my .login and .cshrc
|
||
on this machine (they're not the same on tove, gyre, gymble, and eneevax).
|
||
|
||
Chris
|
||
|
||
: Run this shell script with "sh" not "csh"
|
||
PATH=:/bin:/usr/bin:/usr/ucb
|
||
export PATH
|
||
all=FALSE
|
||
if [ $1x = -ax ]; then
|
||
all=TRUE
|
||
fi
|
||
/bin/echo 'Extracting .cshrc'
|
||
sed 's/^X//' <<'//go.sysin dd *' >.cshrc
|
||
#
|
||
if ($?prompt) then
|
||
echo -n '['
|
||
set path=(. ~chris/bin ~chris/sys /usr/local/bin /g/local /usr/ucb /bin /usr/bin /usr/games /etc /usr/hosts)
|
||
echo -n 'cshrc]'
|
||
set ignoreeof history=100 time=2 mail=(10 /usr/spool/mail/chris) cdpath=(~ /g/VOTRAX ~/bin /g/chris ..) S=/usr/spool/uucp CICO=/usr/lib/uucp/uucico
|
||
alias hh history;alias h 'history 20';alias j jobs;alias o popd
|
||
alias status 'echo $status';alias so source;alias bye logout
|
||
alias p pushd;alias done 'echo ';alias kb "rm -i .*.bak *.bak .*.CKP *.CKP"
|
||
alias kc "rm -i .*.CKP *.CKP";alias e emacs;alias @@term 'kill -9 $$'
|
||
alias af ~chris/af/af;alias cdl "cd \!:1;ls \!:2*";alias lsl "ls -li"
|
||
alias lsa "ls -A";alias lsla "ls -lai";alias up "cd ..";alias upl "cd ..;ls"
|
||
alias cdll "cd \!:1;lsl \!:2*";alias lsld "lsl -d";alias lslg "lsl -g"
|
||
alias upll "cd ..;lsl";alias pl "pushd \!:1;ls \!:2*";alias z logout
|
||
alias pll "pushd \!:1;lsl \!:2*";alias ol "popd;ls";alias oll "popd;lsl"
|
||
alias cdla "cd \!:1;lsla \!:2*";alias v80 'echo -n "[?2l";set term=VT52'
|
||
alias v132 'echo -n "[?2l";set term=VT52.132';alias ansi 'echo -n "<"'
|
||
alias fix 'stty newcrt erase kill ';alias ca 'ex "+1,.|q"'
|
||
alias own 'cp \!:1 /tmp/own$$;rm -f \!:1;mv /tmp/own$$ \!:1'
|
||
alias save 'cp \!:1 \!:1.old;chmod a-w \!:1.old;chmod +w \!:1'
|
||
alias c80 'echo -n "[?3l";set term=DT80';alias suspend 'suspend;dirs'
|
||
alias col80 'echo -n "[?3l";colnum 80';alias a alias
|
||
alias c132 'echo -n "[?3h";set term=DT80.132'
|
||
alias col132 'echo -n "[?3h";colnum 132'
|
||
alias hold 'echo -n "[H[J[12;20H[5mI'"'"'ll be right back[m[20H";lock;echo -n "[H[J"'
|
||
alias feed '(sleep 3000;echo Feeding time\\!)&'
|
||
alias open 'set noglob;eval `/usr/chris/bin/open \!:*`;unset noglob'
|
||
alias loav /usr/mark/bin/load
|
||
setenv VISUAL /usr/ucb/vi;setenv EDITOR /usr/local/bin/emacs
|
||
setenv EPATH :/usr/chris/emacs:/usr/israel/emacs:/usr/emacs/loclib:/usr/emacs/maclib
|
||
alias dir ls;alias era rm;alias printman /usr/man/printman;alias d dirs
|
||
alias clx 'rm -f /tmp/X_lock.\!:1 /usr/spool/uucp/LCK..\!:1'
|
||
alias aasize 'set noglob;eval `/usr/local/bin/aasize \!:1`;unset noglob'
|
||
alias aasave 'set noglob;eval `/usr/local/bin/aasave \!:1`;unset noglob'
|
||
alias down 'cd `echo */|awk '\''{print $1}'\''`;echo $cwd'
|
||
alias downl 'down;ls';alias downll 'down;lsl';alias mark 'set \!:1=$cwd'
|
||
alias lso 'lsla | sort +4 -rn';alias edenv 'source ~chris/bin/edenv'
|
||
alias aibib 'echo \!*|lookbib -n -p /usr/randy/papers/airefs|page'
|
||
alias checkque /usr/lib/mmdf/checkque;alias sum-dial /usr/lib/mmdf/sum-dial
|
||
alias deliver 'sh -c "HOME=/ /usr/lib/mmdf/deliver \!:*"'
|
||
alias ll 'ls -l';alias tm 'telnet 128.8.0.8'; alias uptime
|
||
endif
|
||
umask 22
|
||
if ($?prompt) then
|
||
set prompt='[\!] '
|
||
echo ''
|
||
endif
|
||
//go.sysin dd *
|
||
made=TRUE
|
||
if [ $made = TRUE ]; then
|
||
/bin/chmod 644 .cshrc
|
||
/bin/echo -n ' '; /bin/ls -ld .cshrc
|
||
fi
|
||
/bin/echo 'Extracting .login'
|
||
sed 's/^X//' <<'//go.sysin dd *' >.login
|
||
#
|
||
stty erase ^H kill ^X intr decctlq nl0 cr0 ff0
|
||
cd;setenv TERMCAP /usr/chris/.termcap
|
||
# cp .exrc1 .exrc
|
||
# Set up the terminal
|
||
# 4025=Tek4025 sd=dialup x1=Xer 1750 GG=Gigi d4=GT40 aaa=AAA else DT80
|
||
# if (`slowtty` == y) then
|
||
# cp .mailrc2 .mailrc
|
||
# else
|
||
# cp .mailrc1 .mailrc
|
||
# endif
|
||
set wantbaud=0
|
||
top:
|
||
switch ($TERM)
|
||
case su:
|
||
case network:
|
||
set wantbaud=1
|
||
case sd:
|
||
case unknown:
|
||
set term=`/ful/chris/bin/selterm`
|
||
goto top
|
||
case 4025:
|
||
stty crt tabs;tabset.tek
|
||
breaksw
|
||
case h6:
|
||
case hp:
|
||
case hp2623:
|
||
case hp2626:
|
||
stty tabs crt
|
||
breaksw
|
||
case v550:
|
||
stty crt;set prompt='[7m[\!][m '
|
||
breaksw
|
||
case GG:
|
||
stty crt;unsetenv TERMCAP;set prompt='[7m[\!][m '
|
||
breaksw
|
||
case d4:
|
||
set term=gt40;stty crt
|
||
breaksw
|
||
case aaa:
|
||
case aaa-60:
|
||
set term=aaa prompt='[7m[\!][m ';stty tabs crt;unsetenv TERMCAP
|
||
aakey -f /ful/chris/.aakeys
|
||
if (`tty` =~ /dev/tty*) then
|
||
echo -n 'Lines? [30] '
|
||
set lines=$<
|
||
if ($lines != ) then
|
||
aasize $lines
|
||
endif
|
||
endif
|
||
breaksw
|
||
case h19:
|
||
case h19a:
|
||
case kb:
|
||
set term=h19a prompt='[7m[\!][m ';stty tabs crt crtkill
|
||
breaksw
|
||
case Dq:
|
||
case DT80:
|
||
case D5:
|
||
case vt100:
|
||
set term=DT80 prompt='[7m[\!][m '
|
||
echo -n '[?4l';stty crt
|
||
breaksw
|
||
default:
|
||
unsetenv TERMCAP;echo "Wonder what $TERM is?"
|
||
breaksw
|
||
endsw
|
||
if ($wantbaud == 1) then
|
||
selbaud
|
||
endif
|
||
unset wantbaud lines
|
||
# mailcount
|
||
checknews
|
||
setenv ROGUEOPTS 'jump,ask,terse,flush,passgo,fruit=hregfx'
|
||
setenv PAGER /usr/ucb/page
|
||
setenv SPELL_LISTS /ful/chris/.splist
|
||
alias logout 'source /ful/chris/.logout.';alias exit logout
|
||
# /usr/games/fortune
|
||
w; # calend; /usr/chris/bin/ac 22:00
|
||
echo ----------------------------------------------------------
|
||
# rehist .history
|
||
//go.sysin dd *
|
||
made=TRUE
|
||
if [ $made = TRUE ]; then
|
||
/bin/chmod 644 .login
|
||
/bin/echo -n ' '; /bin/ls -ld .login
|
||
fi
|
||
|
||
::::::::::::::
|
||
cshrc/3
|
||
::::::::::::::
|
||
Date: Fri, 14 Sep 84 14:59:01 pdt
|
||
From: hplabs!sdcrdcf!sdcsvax!sdcc6!loral!hlb (Howard Brandell)
|
||
To: sdcc6!sdcsvax!sdcrdcf!hplabs!resonex!nancy
|
||
Subject: .cshrc
|
||
|
||
I am sending my entire .cshrc file because I have some things in it
|
||
that help me out.
|
||
|
||
Firstly, note the aliases that allow me to selectively read those
|
||
newsgroups of interest. Aha! You may say I can put it all in the
|
||
.newsrc file and have the system inform me when there is news and
|
||
read it out simultaneously. But, sometimes we get news during the
|
||
course of the day and I like to check my favorites continuously.
|
||
|
||
Also, not the aliases for tip. These allow me to dial my remote
|
||
locations with both spped and accuracy. As an aside, I have
|
||
created a .tiprc file which logs all my remote host conversation
|
||
into a file. In this way, nothing is lost. Note the 'rt' command
|
||
which allows me to purge tiplog.
|
||
|
||
alias a alias
|
||
a sd "msg,gju,glw,kay,sdi"
|
||
a ds "chmod 600 .signature"
|
||
a es "chmod 640 .signature"
|
||
a vc "ccalc"
|
||
a m "mail"
|
||
a p "more"
|
||
a rk "readnews -n net.kids"
|
||
a ra "readnews -n net.micro.apple"
|
||
a ri "readnews -n net.micro.pc"
|
||
a rs "readnews -n sdnet.computing"
|
||
a rb "readnews -n net.sport.baseball"
|
||
a rn "readnews -n net.columbia"
|
||
a rw "readnews -n net.wanted"
|
||
a rl "readnews -n net.legal"
|
||
a r "readnews"
|
||
a logs "readnews -n net.sources -l>sources.log"
|
||
a motd "cat /etc/motd|more"
|
||
a h "history -r \!*|more"
|
||
a t1 "tip 561-7271"
|
||
a t2 "tip 452-1869"
|
||
a t3 "tip 283-1538"
|
||
a t4 "tip 692-1961"
|
||
a t5 "tip 270-1166"
|
||
a t6 "tip 217-1900"
|
||
a rt "rm tiplog"
|
||
a bye logout
|
||
a cd "cd \!* ; dirs"
|
||
a term 'set noglob; eval `tset -n -s \!*`'
|
||
a wat "ps -au | more"
|
||
a pv printenv
|
||
a j "jobs -l"
|
||
a f "finger|more"
|
||
a l ls -F
|
||
|
||
if ( $?prompt == 1 ) then
|
||
set prompt="\!: "
|
||
set mail=(60 /usr/spool/mail/$USER)
|
||
endif
|
||
set history = 24
|
||
set cdpath = (. ~)
|
||
|
||
Also note the aliases for the more mundane commands, like mail
|
||
and more -c.
|
||
|
||
Hope this has been of some help. Please disregard my earlier
|
||
transmission as I had some operational difficulties. Thx.
|
||
|
||
::::::::::::::
|
||
cshrc/4
|
||
::::::::::::::
|
||
From: sun!dagobah!mike
|
||
Date: Mon, 17 Sep 84 23:27:05 pdt
|
||
To: sun!resonex!nancy
|
||
Subject: .cshrc
|
||
|
||
set mail=(10 /usr/spool/mail/$user)
|
||
set path=(. ~/bin /usr/lfl/bin /usr/ucb /bin /usr/bin /usr/hosts /usr/suntool)
|
||
set cdpath = ( . .. ~ /usr /u0 /u1 /audio)
|
||
set mail=(10 /usr/spool/mail/$user)
|
||
set msgs=(10 /usr/msgs/bounds)
|
||
set history = 50
|
||
|
||
source ~/.aliases
|
||
set D = /net/dagobah/u0/mike
|
||
set d = /net/dim/u0/mike
|
||
set k = /net/kessel/u0/mike
|
||
set n = /net/nellybell/u0/mike
|
||
if (! $?HOST) setenv HOST `hostname`
|
||
alias s_prompt 'set prompt = "[$HOST\\\!$cwd]\\
|
||
% "'
|
||
alias cd 'cd \!*; s_prompt'
|
||
s_prompt
|
||
|
||
|
||
::::::::::::::
|
||
cshrc/5
|
||
::::::::::::::
|
||
From: sun!dagobah!mike
|
||
Date: Mon, 17 Sep 84 23:27:19 pdt
|
||
To: sun!resonex!nancy
|
||
Subject: .aliases
|
||
|
||
alias alice cu -s 1200 2016654115
|
||
alias rabbit cu -s 1200 2016654150
|
||
alias yale cu -s 1200 2034323510
|
||
alias ajax cu -s 1200 2015828265
|
||
|
||
alias ts 'setenv TERM `tset - \!* -Q`;set term = $TERM;unsetenv TERMCAP;'
|
||
alias aa "ts aaa-26; aaapf"
|
||
alias aaa aa
|
||
|
||
alias h history
|
||
alias l 'ls -Fa'
|
||
alias lp l -t
|
||
alias ll 'ls -laF | more'
|
||
alias wo /u0/td/bin/who
|
||
alias m 'make \!* >>& errors &'
|
||
alias mail Mail
|
||
alias ml /bin/mail
|
||
alias lm ml
|
||
alias rml 'rm -f /usr/spool/mail/mike'
|
||
alias RM '/bin/rm -rf'
|
||
alias clean 'rm *.o core errors a.out'
|
||
alias CLEAN 'RM *.o core errors a.out ~/.REMOVED; mkdir ~/.REMOVED'
|
||
alias die 'clear; kill -HUP $$'
|
||
alias tlog tail -f /usr/spool/uucp/LOGFILE
|
||
alias ter tail -f errors
|
||
|
||
#
|
||
# For job control:
|
||
# Use 'fg' to bring job into the foreground, 'bg' to run job in background.
|
||
# 'v', to restart vi editor
|
||
# 'W', to restart ice editor
|
||
# 'j', to list out jobs
|
||
# 'k', to kill jobs; 'k 2' kills job [2]; 'k' kills the most recent job (+).
|
||
alias v %vi
|
||
alias j jobs
|
||
alias k 'kill %\!*'
|
||
alias sysline ~/bin/sysline -Dhmrj
|
||
|
||
|
||
::::::::::::::
|
||
cshrc/6
|
||
::::::::::::::
|
||
Date: Fri, 21 Sep 84 01:17:43 cdt
|
||
From: ihnp4!uiucdcs!liberte (Daniel LaLiberte)
|
||
To: sun!resonex!nancy
|
||
Subject: .cshrc trick
|
||
|
||
I like my recursive prompt that shows the depth of shell calls with added
|
||
">"s. It also gives a different prompt for my superuser which has the same
|
||
home. Additionally, we have several vaxes, uiucdcs*, networked with
|
||
ethernet. Upgrades are easier with the same .cshrc on all machines.
|
||
|
||
|
||
...
|
||
if (! $?PROMPT) setenv PROMPT "" # initialize
|
||
setenv PROMPT "$PROMPT>" # add ">"
|
||
if ($?prompt) then
|
||
set sys = `hostname`
|
||
if ("$prompt" == "% ") then # regular user
|
||
set prompt = `echo $sys | sed s/uiucdcs//`
|
||
else if ("$prompt" == "# ") then # super user
|
||
set prompt = "$sys#"
|
||
endif
|
||
set prompt = "$prompt\!$PROMPT "
|
||
endif
|
||
|
||
|
||
My login prompt (on uiucdcs) is:
|
||
|
||
1>
|
||
|
||
A csh call will produce:
|
||
|
||
1>>
|
||
|
||
Remote login to uiucdcsb, for example:
|
||
|
||
b1>
|
||
|
||
Superuser on uiucdcsb:
|
||
|
||
uiucdcsb#1>>
|
||
|
||
|
||
I have an alarm script and a spooled rcp that both use `at`.
|
||
|
||
Daniel LaLiberte
|
||
ihnp4!uiucdcs!liberte
|
||
|
||
|
||
::::::::::::::
|
||
cshrc/7
|
||
::::::::::::::
|
||
Date: Sun, 7 Oct 84 20:35:02 pdt
|
||
From: Ken Greer <hplabs!kg>
|
||
To: resonex!nancy
|
||
Subject: Xmas is early this year...
|
||
|
||
Here's what I thought were the most interesting things in my
|
||
csh profile.
|
||
|
||
1. Prompt is (curdir hist#), or [curdir hist#] if running as su.
|
||
The brackets stack, so if I login as kg and su to kgsu, my prompt
|
||
is [(curdir hist#)] indicating my previous shell was non-su.
|
||
In both cases, the current directory always appears in prompt.
|
||
|
||
2. On that subject, I heartily recommend a separate su login
|
||
for each su-er on a system. This lets everyone have their
|
||
own profile, and when they quit you don't have to change the su passwd,
|
||
just remove their su.
|
||
|
||
3. The directory stuff. (I prefer it to pushd/popd.)
|
||
ds - displays directory stack (set to length DSSIZE below).
|
||
go # - go to directory item number #
|
||
back - go to previous directory.
|
||
cd - stack current directory and go to a new one. Oldest directories
|
||
fall off end of stack (whose size is DSSIZE).
|
||
|
||
4. The "e" and "ec" commands let you edit the last or any command.
|
||
If works with a special program. Would you like that?
|
||
|
||
5. Delete/Undelete - special program. Lets you recover deleted
|
||
files up to three days (user selectable).
|
||
|
||
6. Do you know about my tcsh? Not sure how it fits in with tricks though.
|
||
|
||
-Ken
|
||
|
||
|
||
# Fancy prompt...
|
||
if ($?prompt) then
|
||
if (! $?LEFTPROMPT) setenv LEFTPROMPT ""
|
||
if (! $?RIGHTPROMPT) setenv RIGHTPROMPT ""
|
||
if (`whoami` == root) then
|
||
setenv LEFTPROMPT '['"$LEFTPROMPT"
|
||
setenv RIGHTPROMPT "$RIGHTPROMPT"']'
|
||
set path=(~/bin /usr/local/etc /etc /usr/local/bin /usr/ucb /bin /usr/bin .)
|
||
else
|
||
setenv LEFTPROMPT '('"$LEFTPROMPT"
|
||
setenv RIGHTPROMPT "$RIGHTPROMPT"')'
|
||
set path=(~/bin /usr/local/bin /usr/ucb /bin /usr/bin .)
|
||
endif
|
||
alias setprompt 'set prompt = "${LEFTPROMPT}${cwd} \\!${RIGHTPROMPT} "'
|
||
setprompt
|
||
alias a alias
|
||
|
||
# directory manipulation...
|
||
set DSSIZE = 10
|
||
if (! $?DS) set DS = (~)
|
||
a back 'set xx=$DS[$#DS] DS[$#DS]=$cwd; chdir $xx; unset xx; setprompt'
|
||
a go 'set xx=$DS[\!*] DS[\!*]=$cwd; chdir $xx; unset xx; setprompt'
|
||
a ds 'echo $DS | tr " " "\012" | cat -n'
|
||
a cd 'if ($#DS >= $DSSIZE) shift DS; set DS = ($DS $cwd);chdir \!*; setprompt'
|
||
|
||
# virtual remove...
|
||
a rm del
|
||
a rm! /bin/rm
|
||
|
||
# edit command...
|
||
a e '/usr/local/bin/ec \!-1:q'
|
||
a ec '/usr/local/bin/ec "\!*:q"'
|
||
|
||
# misc...
|
||
a j jobs
|
||
a ls '/usr/ucb/ls -F'
|
||
a tag '/usr/ucb/vi -ta \!*'
|
||
a ts 'set noglob;eval `tset -s -Q \!*`'
|
||
a wd 'echo $cwd'
|
||
endif
|
||
|
||
|
||
::::::::::::::
|
||
cshrc/8
|
||
::::::::::::::
|
||
Date: Thu, 13 Sep 84 08:36:47 edt
|
||
From: sun!decvax!genrad!teddy!dls (Diana L. Syriac)
|
||
To: genrad!decvax!decwrl!sun!idi!resonex!nancy
|
||
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like
|
||
|
||
I'm sorry, I don't really have any "tricks" to make life easier, I'm also
|
||
a rather new Unix user....except for one:
|
||
I use setenv a lot to define a bunch of directories that I use
|
||
a lot. For example, I have in my .cshrc:
|
||
setenv obc ~doc/rts/obc
|
||
So anytime I want to get to that directory (or just look at it), I
|
||
just type: ls $obc/filename
|
||
These environment variables work inside of mail as well as inside of
|
||
emacs.
|
||
I suppose you already have that one from other people.
|
||
|
||
We also have on our system some "local" programs that make life a lot easier:
|
||
We have an "lf" and "dir" that replaces "ls" and "ls -l", but with an added
|
||
feature: directories are displayed in bold letter, executables are displayed
|
||
in reverse video and special files are displayed in flashing letters. It's
|
||
quite easy to see at a glance what the files are or where you want to go.
|
||
|
||
We also have a "pushd" and "popd" which replace the "cd" command.
|
||
pushd directory
|
||
will pushd a directory onto the "stack", and change to it. After you're
|
||
finished with that directory, just typing
|
||
popd
|
||
will put you back to where you were. There is a "dirs" command to
|
||
allow you to look at the "stack" to see where you are, where you've been.
|
||
If you use "cd" instead, it's smart enough to change your stack and replace
|
||
the current directory with the one specified in "cd". And if you just say
|
||
"pushd" by itself, it will SWAP the current directory with the last directory
|
||
you were in, making it very easy to toggle between two directories.
|
||
|
||
Other things that we've done:
|
||
Built a script for the nroff command that is used by most people
|
||
on the system, including macros and some "local" filters to make it look
|
||
nice on terminal, line printer, and diablo. I have also created a little
|
||
program which can be used in conjunction with nroff to produce "change bars"
|
||
at the left margin of documents. We used the change bars quite a lot under
|
||
vms rno.
|
||
We have a set of programs that produce "C" listings, with a table
|
||
of contents showing all files AND routines, page numbered and file numbered,
|
||
each file has a line number at left margin indicating file and line number
|
||
(eg: 3.41 refers to file 3, line 41), and at the very end of listing, there
|
||
is a cross-reference of all tokens, giving file.line references. Part of
|
||
this set of programs was taken directly off the net and modified for our
|
||
own use.
|
||
|
||
Well, that's all that I can think of for now. BUT what I really mailed
|
||
to you was for something that I want. At the last DECUS, one of the speakers
|
||
demonstrated a little program that he wrote that allowed him to keep a
|
||
running log of what he did every day. The program started up when he logged
|
||
on, and ran in the background. Every 15 minutes, it would beep at him,
|
||
asking him to input a line telling what he was currently doing. If ignored,
|
||
it would beep at him every minute until he input something to it. I don't
|
||
know who the guy was, and I lost his business card, but I'd sure like to
|
||
get that program if you have it. Thanks much.
|
||
|
||
Diana L. Syriac
|
||
GenRad, Concord, Ma.
|
||
decvax!genrad!teddy!dls
|
||
|
||
|
||
::::::::::::::
|
||
logins/1
|
||
::::::::::::::
|
||
From: sun!dagobah!mike
|
||
Date: Mon, 17 Sep 84 23:26:53 pdt
|
||
To: sun!resonex!nancy
|
||
Subject: .login
|
||
|
||
#tset -m dialup:aaa-60 -Q
|
||
tset -m dialup:c100-4p -Q
|
||
setenv TERM $term
|
||
switch ($TERM)
|
||
case dialup:
|
||
set term = aaa-60; setenv TERM $term
|
||
~/bin/aaapf
|
||
breaksw
|
||
case c100-4:
|
||
case c108-4p:
|
||
sysline
|
||
case c100-4p:
|
||
setkeys
|
||
endsw
|
||
stty new erase "^?"
|
||
|
||
biff y
|
||
setenv notify true
|
||
setenv CWD $cwd
|
||
setenv SHELL /bin/csh
|
||
setenv MAIL ~/Mail
|
||
setenv MANPATH /u0/pn/man:/u0/mike/Man:/usr/lfl/man:/usr/man
|
||
setenv INCPATH /usr/lfl/include:/usr/include:/u0/mike/Include
|
||
setenv LIBPATH /usr/lfl/lib:/lib:/usr/lib:/u0/mike/Lib
|
||
setenv LOADPATH /usr/src/lfl/bin/emacs.unipress/emacs4.2/maclib
|
||
setenv EDITOR /usr/ucb/vi
|
||
uupoll ucbvax
|
||
msgs
|
||
|
||
|
||
::::::::::::::
|
||
logins/2
|
||
::::::::::::::
|
||
Date: Fri, 14 Sep 84 10:42:43 edt
|
||
From: Jay Weber <amd!mordor!ut-sally!seismo!rochester!jay>
|
||
To: ut-sally!mordor!dual!amd!resonex!nancy
|
||
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like
|
||
|
||
I use the hold option in my .mailrc, which keeps messages around
|
||
until you explicitly delete them. That's a popular option since
|
||
it makes it easy to keep around descriptions of things to do, but
|
||
it gets hard to tell when you have new mail and how much. So, I
|
||
have this in my .login:
|
||
|
||
@ newmail= `from $mail[$#mail] |awk 'END{print NR}'` - `cat .mailsize`
|
||
if ($newmail == 1) then
|
||
echo "(There is one new mail message.)"
|
||
else
|
||
if ($newmail > 1) echo "(There are $newmail new mail messages.)"
|
||
endif
|
||
------------
|
||
and this in my .logout:
|
||
|
||
if (-r $mail[$#mail]) then
|
||
from $mail[$#mail] | awk 'END{print NR}' >~/.mailsize
|
||
endif
|
||
------------
|
||
|
||
Jay Weber
|
||
..!seismo!rochester!jay
|
||
jay@rochester.arpa
|
||
|
||
|
||
::::::::::::::
|
||
logins/3
|
||
::::::::::::::
|
||
Date: Fri, 14 Sep 84 15:16:00 cdt
|
||
To: ctvax!convex!allegra!resonex!nancy
|
||
From: allegra!convex!trsvax!gm (George Moore)
|
||
Subject: neat .login's
|
||
|
||
Nancy,
|
||
Here is some of the aliases I use, as well as part of my .login
|
||
file: (We are running 4.1BSD on a 11/780)
|
||
|
||
alias back 'set back=$old; set old=$cwd; cd $back; unset back'
|
||
alias cd 'set old=$cwd; chdir \!*; sp'
|
||
alias sp 'set prompt="$cwd> "'
|
||
Those aliases allow my prompt to always be my current directory.
|
||
You never have to run "pwd" again. Looks kindof strange when you
|
||
are in a low directory like /g/usr/src/local/csh, but you get used
|
||
to it. It also allows you to cd to some low dir, and then type
|
||
"back" and you are back in the directory you started in.
|
||
|
||
I have this line in my .login:
|
||
sh -c "$HOME/bin/firstlog &"
|
||
This line allows you to spin off a background job without the
|
||
"[1] 22934" message messing up your screen. Firstlog is done
|
||
below. I have a security program which goes out and checks a few
|
||
key files and directories (/etc/passwd, /etc/group, /usr/lib/crontab,
|
||
/etc). If anything has changed, it sends me mail informing me of the
|
||
fact. But I only wish it run once a day, at the time I first login for
|
||
the day. (I don't want it run from crontab, that makes things too
|
||
predictable for the users)
|
||
|
||
---------------------------------------------------------------------
|
||
#! /bin/csh
|
||
# Firstlog -- finds out if this is the first time I have logged in
|
||
# today and start-up all sorts of neat stuff if it is.
|
||
|
||
set date=`/bin/date`
|
||
set now=`/usr/ucb/last $user`
|
||
if ($date[2] != $now[13] || $date[3] != $now[14]) then
|
||
sh -c "$HOME/personal/security/secure &"
|
||
endif
|
||
---------------------------------------------------------------------
|
||
|
||
I hope this helps. George Moore
|
||
gm@trsvax.UUCP
|
||
|
||
|
||
From: Nancy Blachman <decvax!decwrl!sun!idi!resonex!nancy@Ucb-Vax.ARPA>
|
||
To: net.unix,net.unix-wizards,net.sources
|
||
Subject: Actual Tricks, shells, csh aliases and the like, 2 of 3
|
||
Date: 16 Oct 84 21:22:55 GMT
|
||
Organization: Resonex Inc., Sunnyvale, CA
|
||
|
||
> [Know anybody with a GREAT .login or .cshrc?]
|
||
|
||
> I'm interested in collecting the little tricks, shell scripts, awk
|
||
> hacks, csh aliases, and such that people have built to make their daily
|
||
> life a little easier or more automatic. Being a fairly new system
|
||
> administrator I don't have the big toolbox that years of messing around
|
||
> will leave you with. If you have any hacks you're proud of (or that
|
||
> you aren't proud of, but which work anyway), and you're willing to make
|
||
> them public, mail them to me. I'll collect, collate, shuffle, sort,
|
||
> munge, judge, select and discard them and then "summarize to the net".
|
||
|
||
This article focuses shell scripts I received in response to my solicitation.
|
||
The first article of this series concentrates on aliases, and .cshrc and
|
||
.login files. The third article centers on C programs and awk scripts.
|
||
|
||
/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/
|
||
> Nancy Blachman {allegra,hplabs,ihnp4,sun}!resonex!nancy (408)720 8600 x37 <
|
||
/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/
|
||
|
||
::::::::::::::
|
||
shells/1
|
||
::::::::::::::
|
||
Date: Thu, 13 Sep 84 12:49:57 edt
|
||
From: allegra!vax135!cornell!tesla!mac (Michael Mc Namara)
|
||
To: cornell!vax135!houxm!mhuxl!ulysses!allegra!resonex!nancy
|
||
Subject: Cute cshell - sh scripts
|
||
|
||
If your are like most UNIX systems, you have a plethora of different
|
||
terminals that your system is supposed to support. Sure, with termcap
|
||
and terminfo, and programs written to use them, the interface gets easier.
|
||
If you only ever login to one particular terminal, you can
|
||
|
||
set term = "vt131"
|
||
|
||
or
|
||
|
||
TERM=vt131
|
||
export TERM
|
||
|
||
in your .login or .profile.
|
||
|
||
But what if you, or some of your users, drift around using different
|
||
terminal types-- You have a terminal room with many different terminals.
|
||
|
||
Here is a set of shell scripts & C programs that use the "echo terminal
|
||
type" command that many terminals support, to do automatic terminal type
|
||
identification and setting: (of course I've only made it work for the
|
||
terminals we have here at Cornell, and some day I should write more of it
|
||
in C...)
|
||
|
||
This one is written for cshell:
|
||
|
||
##########################################
|
||
# Identify and set terminal type (csh)#
|
||
##########################################
|
||
set noglob
|
||
echo Please wait...
|
||
stty cbreak -echo
|
||
# this sequence will cause all terminals we have to echo something
|
||
# except for adm's; those users are told to hit 'a' when they see
|
||
# please wait
|
||
echo ' CZ[c'
|
||
sleep 1
|
||
# this calls a c program to grab the id string from the terminal
|
||
# program is included later...
|
||
set type = `/usr/new/rin.login`
|
||
stty -cbreak echo new crt
|
||
#########################
|
||
# the or in the vt100 terminal type is because vt100's respond
|
||
# to both ^[Z and ^[[c, but DEC threatens to eliminate one of
|
||
# the responces (I forget which).. The extra stty back you see
|
||
# with DG terminals (Data General) is because their backspace is
|
||
# ^Y instead of ^H ( Home on DG terminals) This involves a modification
|
||
# of stty, which you would care about only if you have them--Write to me.
|
||
##################
|
||
if ( $type == "[?1;0c" || $type == "[?1;0c[?1;0c" ) then
|
||
set term = vt100
|
||
echo "VT101"
|
||
else if ( $type == "[?1;2c" || $type == "[?1;2c[?1;2c" ) then
|
||
set term = vt100
|
||
echo "VT100"
|
||
else if ( $type == "[?1;11c[?1;11c") then
|
||
set term = ct500
|
||
echo "[7mCIT - 500[m"
|
||
else if ( $type == "[?12;5;0;102c" ) then
|
||
set term = vt100
|
||
echo "VT125"
|
||
else if ($type == "[?1;2c[?1;2c") then
|
||
set term = vt100
|
||
echo "VT100, with Selenar Graphics"
|
||
else if ( $type == "o#\!R" ) then
|
||
set term = dg200
|
||
stty stop undef start undef back
|
||
echo "DDG200E"
|
||
else if ( $type == "o#'C3" ) then
|
||
set term = dg450
|
||
stty back
|
||
echo "FS11BFS00 DATA GENERAL DASHER D450"
|
||
else if ( $type == "o#'K3" ) then
|
||
set term = dg450
|
||
stty back
|
||
echo "FS11BFS00 DATA GENERAL DASHER D450"
|
||
else if ( $type == "/K" ) then
|
||
set term = vt52
|
||
echo "Visual 50"
|
||
else if ( $type =~ "\\4*" ) then
|
||
set term = hp2621
|
||
echo HP2621
|
||
else if ( $type =~ "a" ) then
|
||
set term = adm3a
|
||
echo "adm3a"
|
||
else if ($type == "50" ) then
|
||
set term = w50
|
||
echo "WYSE50"
|
||
else
|
||
# Ask user for terminal type -- for some reason the above didn't work
|
||
set no_name_yet=1
|
||
set no_name_yet = 1;
|
||
while( $no_name_yet )
|
||
echo -n "Please enter terminal type (hit return for menu) "
|
||
set ttyname = ($< );
|
||
switch( $ttyname )
|
||
case d450:
|
||
case dg450:
|
||
set term=dg450;
|
||
stty back
|
||
set no_name_yet = 0;
|
||
breaksw;
|
||
case vt100:
|
||
set term=vt100;
|
||
set no_name_yet = 0;
|
||
breaksw;
|
||
case v50:
|
||
case vt52:
|
||
set term=vt52;
|
||
set no_name_yet = 0;
|
||
breaksw;
|
||
case hp2621:
|
||
case hp:
|
||
set term=hp2621;
|
||
set no_name_yet = 0;
|
||
breaksw;
|
||
case wyse50:
|
||
set term=w100;
|
||
set no_name_yet = 0;
|
||
breaksw;
|
||
case adm5:
|
||
set term=adm5;
|
||
set no_name_yet = 0;
|
||
breaksw;
|
||
case adm3+:
|
||
case adm3:
|
||
case adm3a:
|
||
set term=adm3+;
|
||
set no_name_yet = 0;
|
||
case d200:
|
||
case dg200:
|
||
set term=dg200;
|
||
stty stop undef start undef back ;
|
||
set no_name_yet = 0;
|
||
breaksw;
|
||
case other:
|
||
echo -n "Enter terminal name: "
|
||
set term=($< );
|
||
set no_name_yet = 0;
|
||
breaksw;
|
||
case '':
|
||
echo Terminal abbreviations are:
|
||
echo "Dasher 450 : dg450"
|
||
echo "Dasher 200 : dg200"
|
||
echo "Visual 50 : v50"
|
||
echo "VT100 : vt100"
|
||
echo "HP 2621 : hp2621"
|
||
echo "ADM5 : adm5"
|
||
echo "ADM3+ : adm3+"
|
||
echo "Use 'other' to specify terminals not on this menu"
|
||
breaksw;
|
||
default:
|
||
echo "I didn't understand that. Hit return for a menu."
|
||
endsw
|
||
end
|
||
unset no_name_yet
|
||
unset ttyname
|
||
endif
|
||
stty -cbreak
|
||
stty echo
|
||
unset noglob
|
||
|
||
Ok, This one is used for Bourne shell lovers: (I used /bin/test because
|
||
one user had an executable file called test somewhere in his path ahead
|
||
of where this program lived...That one took days to track down...)
|
||
|
||
|
||
echo "Please Wait..."
|
||
stty start stop crt new back -echo cbreak
|
||
echo ' CZ[c'
|
||
sleep 1
|
||
TYPE=`/usr/new/rin.login`
|
||
stty echo -cbreak
|
||
if ( /bin/test \( $TYPE = "[?1;0c" \) -o \( $TYPE = "[?1;0c[?1;0c" \) ) then
|
||
TERM=vt100
|
||
echo "[7mVT101[m"
|
||
elif ( /bin/test \( $TYPE = "[?1;2c" \) -o \( $TYPE = "[?1;2c[?1;2c" \) ) then
|
||
TERM=vt100
|
||
echo "#3[7mVT100[m"
|
||
echo "#4?[7mVT100[m"
|
||
elif ( /bin/test $TYPE = "[?1;11c[?1;11c") then
|
||
TERM=ct500
|
||
echo "CT 500"
|
||
elif ( /bin/test $TYPE = "o#!R" ) then
|
||
TERM=dg200
|
||
stty stop undef
|
||
stty start undef
|
||
stty crt
|
||
stty back
|
||
echo "D DATA GENERAL DASHER D200E"
|
||
elif ( /bin/test $TYPE = "o#'C3" ) then
|
||
TERM=dg450
|
||
stty crt
|
||
stty back
|
||
echo "FS11BFS00 DATA GENERAL DASHER D450"
|
||
elif ( /bin/test $TYPE = "/K" ) then
|
||
TERM=vt52
|
||
echo "UVisual 50T"
|
||
elif ( /bin/test $TYPE = "50" ) then
|
||
TERM=w50
|
||
clear
|
||
echo "WYSE 50"
|
||
elif ( /bin/test $TYPE = "\4088000" ) then
|
||
TERM=hp2621
|
||
echo HP2621
|
||
elif ( /bin/test $TYPE = "a" ) then
|
||
TERM=adm3a
|
||
echo ADM3a
|
||
else
|
||
stty start
|
||
stty stop
|
||
stty new crt
|
||
set no_name_yet=1
|
||
echo
|
||
while ($no_name_yet) do {
|
||
echo
|
||
echo Which terminal do you have?
|
||
echo Hit return for a menu.
|
||
read INP
|
||
case $INP
|
||
in
|
||
100 | v | vt100) {
|
||
TERM=vt100
|
||
break
|
||
} ;;
|
||
adm5) {
|
||
TERM=adm5
|
||
break
|
||
} ;;
|
||
adm3+) {
|
||
TERM=adm3+
|
||
break
|
||
} ;;
|
||
450 | dg450 | d450) {
|
||
TERM=dg450
|
||
stty back
|
||
break
|
||
} ;;
|
||
200 | dg200 | d200) {
|
||
TERM=dg200
|
||
stty stop undef
|
||
stty start undef
|
||
stty back
|
||
break
|
||
} ;;
|
||
50 | vt52 | v50) {
|
||
TERM=vt52
|
||
break
|
||
} ;;
|
||
2621 | hp2621 | hp) {
|
||
TERM=hp2621
|
||
break
|
||
} ;;
|
||
other) {
|
||
echo -n Enter terminal name:
|
||
read tname
|
||
TERM=$tname
|
||
break
|
||
} ;;
|
||
''|?|help) { echo Terminal abbreviations are:
|
||
echo
|
||
echo Dasher 450: dg450
|
||
echo Dasher 200: dg200
|
||
echo Visual 50: vt52
|
||
echo VT100 : vt100
|
||
echo HP 2621 : hp2621
|
||
echo ADM3+ : adm3+
|
||
echo ADM5 : adm5
|
||
echo "Use 'other' to specify other terminals."
|
||
echo
|
||
} ;;
|
||
* ) { echo "I did not understand that."
|
||
} ;;
|
||
esac
|
||
}
|
||
done
|
||
fi
|
||
export TERM
|
||
|
||
*********
|
||
And here is the c program that read's in the terminal ID string:
|
||
|
||
|
||
/* rin -- read in a char string which may not be terminated */
|
||
char buf[256];
|
||
int n;
|
||
main ()
|
||
{
|
||
n = read(0,buf,256);
|
||
write(1,buf,n);
|
||
printf("\n");
|
||
}
|
||
|
||
***************
|
||
|
||
|
||
Use them, abuse them. Of course you have to paw through
|
||
your terminal manuanls to discover what (if any) string they respond to,
|
||
and test for the response accordingly...
|
||
|
||
---MAC
|
||
|
||
|
||
|
||
::::::::::::::
|
||
shells/2
|
||
::::::::::::::
|
||
From: hplabs!azure!billp
|
||
To: tektronix!hplabs!resonex!nancy
|
||
Date: Thursday, 13 Sep 84 09:23:49 PDT
|
||
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like
|
||
|
||
Here are some that I like and use a lot. 'del' and 'undelete' are just two
|
||
links to the same file. This way if somebody copies one, they get the
|
||
other too
|
||
-------------------------------------------------------------------------------
|
||
::::::::::::::
|
||
: mv
|
||
::::::::::::::
|
||
: 'prompts if the destination file already exists'
|
||
/bin/mv -i $*
|
||
-------------------------------------------------------------------------------
|
||
::::::::::::::
|
||
: cp
|
||
::::::::::::::
|
||
: 'prompts if the destination file already exists'
|
||
/bin/cp -i $*
|
||
-------------------------------------------------------------------------------
|
||
::::::::::::::
|
||
: del, undelete
|
||
::::::::::::::
|
||
: '"del" throws files into the waste basket'
|
||
: 'files preceded by "," are automagically removed after 7 days'
|
||
: '"undelete" pulls files out of the waste basket'
|
||
: 'if invoked without an argument, both commands list the contents of the'
|
||
: 'waste basket.'
|
||
|
||
case $0 in
|
||
*del)
|
||
if test -z "$1"
|
||
then
|
||
ls -lus $HOME/.waste_basket
|
||
else
|
||
for i
|
||
do
|
||
echo -n "deleting "
|
||
tmp=`basename $i`
|
||
/bin/mv -i $i $HOME/.waste_basket/,$tmp
|
||
echo $i
|
||
done
|
||
fi;;
|
||
|
||
*undelete)
|
||
if test -z "$1"
|
||
then
|
||
ls -lus $HOME/.waste_basket
|
||
else
|
||
for i
|
||
do
|
||
echo -n "recovering "
|
||
tmp=`basename $i`
|
||
/bin/mv -i $HOME/.waste_basket/,$tmp $i
|
||
echo $i
|
||
done
|
||
fi;;
|
||
esac
|
||
-------------------------------------------------------------------------------
|
||
::::::::::::::
|
||
: vi
|
||
::::::::::::::
|
||
: 'backs up file(s) before editing them'
|
||
: 'files preceded by "," are automagically removed after 7 days'
|
||
for i
|
||
do
|
||
if test -f $i
|
||
then
|
||
echo -n "backing up "
|
||
tmp=`basename $i`
|
||
/bin/cp -i $i $HOME/.vi_backup/,$tmp
|
||
echo $i
|
||
fi
|
||
done
|
||
/usr/ucb/vi $*
|
||
-------------------------------------------------------------------------------
|
||
|
||
Bill Pfeifer
|
||
{ucbvax,decvax,ihnp4,allegra,uw-beaver,hplabs} !tektronix!tekmdp!billp
|
||
|
||
::::::::::::::
|
||
shells/3
|
||
::::::::::::::
|
||
Date: Thu, 13 Sep 84 13:58:09 pdt
|
||
From: turtlevax!ken (Ken Turkowski)
|
||
To: resonex!nancy
|
||
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like
|
||
|
||
You asked for it, you've got it! Here's ALL of my personal nifties:
|
||
Ken
|
||
**************************************************
|
||
|
||
echo x - bin
|
||
mkdir bin
|
||
echo x - bin/CC
|
||
cat >bin/CC <<'!Funky!Stuff!'
|
||
#
|
||
set outname=a.out
|
||
foreach file ($argv)
|
||
if ("$file" =~ *.[cso]) then
|
||
set outname=$file:r
|
||
break
|
||
endif
|
||
end
|
||
echo cc -o $outname $*
|
||
exec cc -o $outname $*
|
||
!Funky!Stuff!
|
||
echo x - bin/appt
|
||
cat >bin/appt <<'!Funky!Stuff!'
|
||
#
|
||
set notetype=$0
|
||
set notetype=$notetype:t
|
||
set notefile=~/.$notetype
|
||
# if ($notetype == appt) then
|
||
# set notetype=appointment
|
||
# set notefile=~/calendar
|
||
# endif
|
||
|
||
if ($#argv == 0) then
|
||
test -t 0 && echo Please enter your $notetype entry '(^D to end):'
|
||
echo ' ' >> $notefile
|
||
exec cat >> $notefile
|
||
endif
|
||
|
||
switch ($1)
|
||
case -:
|
||
exec vi $notefile
|
||
case -rm:
|
||
cat /dev/null > $notefile
|
||
exec echo The ${notetype}s are removed.
|
||
case -what:
|
||
exec cat $notefile
|
||
default:
|
||
echo '' >> $notefile
|
||
echo "$*" >> $notefile
|
||
endsw
|
||
!Funky!Stuff!
|
||
echo x - bin/asfix
|
||
cat >bin/asfix <<'!Funky!Stuff!'
|
||
case $# in
|
||
0)
|
||
file=/tmp/afix$$
|
||
trap "cat $file; rm $file; exit" 0
|
||
trap "rm $file; exit" 3 9
|
||
cat > $file ;;
|
||
1)
|
||
file=$1 ;;
|
||
*)
|
||
echo Usage `basename $0` ' [ <file> ]' ;;
|
||
esac
|
||
ed - $file << EOF
|
||
v/[:\.]/s/^/ /
|
||
g/:./s/:/: /
|
||
wq
|
||
EOF
|
||
!Funky!Stuff!
|
||
echo x - bin/atcat
|
||
cat >bin/atcat <<'!Funky!Stuff!'
|
||
#
|
||
if ($#argv < 2) then
|
||
set cmd=$0
|
||
echo Usage: "$cmd:t <time> <word> [ <word> ... ]"
|
||
exit
|
||
endif
|
||
set atcmd="echo $argv[2-] > `tty`"
|
||
at $1 << EOF
|
||
$atcmd
|
||
EOF
|
||
!Funky!Stuff!
|
||
echo x - bin/atecho
|
||
cat >bin/atecho <<'!Funky!Stuff!'
|
||
#
|
||
if ($#argv < 2) then
|
||
set cmd=$0
|
||
echo Usage: "$cmd:t <time> <word> [ <word> ... ]"
|
||
exit
|
||
endif
|
||
set atcmd="echo $argv[2-] > `tty`"
|
||
at $1 << EOF
|
||
$atcmd
|
||
EOF
|
||
!Funky!Stuff!
|
||
echo x - bin/beautify
|
||
cat >bin/beautify <<'!Funky!Stuff!'
|
||
#
|
||
set TMP=/tmp/cb$$
|
||
foreach file (argv)
|
||
echo Beautifying $file:
|
||
cb < $file > $TMP
|
||
cat $TMP > $file
|
||
end
|
||
rm $TMP
|
||
!Funky!Stuff!
|
||
echo x - bin/blankclean
|
||
cat >bin/blankclean <<'!Funky!Stuff!'
|
||
sed -e 's/^ $//' -e 's/ *$//' $*
|
||
!Funky!Stuff!
|
||
echo x - bin/bphone
|
||
cat >bin/bphone <<'!Funky!Stuff!'
|
||
phonefile=$HOME/.`basename $0`s
|
||
|
||
echo ' '
|
||
|
||
case $# in
|
||
0)
|
||
ed - $phonefile << EOF
|
||
g/./s/$/\\
|
||
/
|
||
g/ /s//\\
|
||
/g
|
||
g/;/s// /g
|
||
1,\$p
|
||
q
|
||
EOF
|
||
exit ;;
|
||
esac
|
||
|
||
case $1 in
|
||
-)
|
||
chmod 644 $phonefile
|
||
vi $phonefile
|
||
chmod 444 $phonefile
|
||
exit ;;
|
||
esac
|
||
|
||
trap "rm /tmp/data$$; exit" 0 2
|
||
for name
|
||
do
|
||
grep -y "$name" $phonefile >> /tmp/data$$
|
||
done
|
||
ed - /tmp/data$$ << EOF
|
||
g/./s/$/\\
|
||
/
|
||
g/ /s//\\
|
||
/g
|
||
g/;/s// /g
|
||
1,\$p
|
||
q
|
||
EOF
|
||
!Funky!Stuff!
|
||
echo x - bin/catalog
|
||
cat >bin/catalog <<'!Funky!Stuff!'
|
||
# catalog - produce complete file structure list from directory
|
||
#
|
||
# Parameters: 1: directory name (optional)
|
||
# 2: indentation string (empty on first call)
|
||
#
|
||
# Produces on standard output the file structure emanating from
|
||
# the current directory. Each descent into a subdirectory
|
||
# is indicated by further indentation. Directories are indicated
|
||
# by surrounding [], and executable files are prefaced with a *.
|
||
#
|
||
if ( $#argv == 0) then
|
||
echo "file structure from directory `pwd`"
|
||
date
|
||
echo ''
|
||
else
|
||
cd $1
|
||
endif
|
||
foreach i ( * )
|
||
if ( -d $i ) then
|
||
echo "${2}[ $i ]"
|
||
$0 $i "$2 . "
|
||
endif
|
||
if ( "$i" != '*' ) then
|
||
if ( -x $i ) then
|
||
echo "${2} *$i "
|
||
else
|
||
echo "${2} $i "
|
||
endif
|
||
endif
|
||
endif
|
||
end
|
||
!Funky!Stuff!
|
||
echo x - bin/circum
|
||
cat >bin/circum <<'!Funky!Stuff!'
|
||
there=$1
|
||
shift
|
||
otherstuff="$*"
|
||
back=`whoami`
|
||
last=`hostname`
|
||
IFS=' !
|
||
'
|
||
for link in $there
|
||
do
|
||
back="$last!$back"
|
||
last=$link
|
||
done
|
||
IFS='
|
||
'
|
||
echo mail $there!$back
|
||
(date; echo "$otherstuff") | mail -s "Circumlocution to $last" $there!$back
|
||
!Funky!Stuff!
|
||
echo x - bin/comfmt
|
||
cat >bin/comfmt <<'!Funky!Stuff!'
|
||
exec fmt | \
|
||
sed -e '1s/^\([ ]*\)/\1\/\* /' -e '2,$s/^\([ ]*\)/\1 \* /' -e '${P
|
||
s/\*.*/*\//
|
||
}'
|
||
!Funky!Stuff!
|
||
echo x - bin/comstrip
|
||
cat >bin/comstrip <<'!Funky!Stuff!'
|
||
exec sed -e 's/\/\*//' -e 's/\*\///' -e 's/^[ ]*\** *//'
|
||
!Funky!Stuff!
|
||
echo x - bin/decvert
|
||
cat >bin/decvert <<'!Funky!Stuff!'
|
||
#
|
||
if ($#argv == 0) then
|
||
set args=`cat`
|
||
if ($#args != 0) $0 $args
|
||
exit
|
||
endif
|
||
|
||
foreach hexnum ($argv)
|
||
dc << EOF
|
||
16i
|
||
${hexnum}p
|
||
EOF
|
||
end
|
||
!Funky!Stuff!
|
||
echo x - bin/f77
|
||
cat >bin/f77 <<'!Funky!Stuff!'
|
||
PATH=/usr/bin
|
||
SPECLIB=/usr/ken/cmd/lib/libc.a
|
||
exec f77 "$@" $SPECLIB
|
||
!Funky!Stuff!
|
||
echo x - bin/famove
|
||
cat >bin/famove <<'!Funky!Stuff!'
|
||
#
|
||
if ($#argv != 2) then
|
||
echo Usage: $0 '<source family root> <destination family root>'
|
||
exit
|
||
endif
|
||
foreach file ($1.*)
|
||
set suffix=`expr $file : "$1\.\(.*\)"`
|
||
echo mv $file $2.$suffix
|
||
mv $file $2.$suffix
|
||
end
|
||
if (-e $1) then
|
||
echo mv $1 $2
|
||
mv $1 $2
|
||
endif
|
||
!Funky!Stuff!
|
||
echo x - bin/gredit
|
||
cat >bin/gredit <<'!Funky!Stuff!'
|
||
#
|
||
set CAESAR=/mnt/cad/bin/caesar
|
||
set SEARCHPATH=(-p ::/usr/ken/caesar/symlib)
|
||
set COLORMAP=(-c mumap.cmap)
|
||
set GRTERM=ttyh7
|
||
set caesarfile=()
|
||
foreach parm ($argv)
|
||
if ($?flag) then
|
||
switch ($flag)
|
||
case g:
|
||
set GRTERM=$parm
|
||
breaksw
|
||
case p:
|
||
set SEARCHPATH=(-p "$parm")
|
||
breaksw
|
||
case R:
|
||
set SEARCHPATH=($SEARCHPATH:$parm)
|
||
breaksw
|
||
case c:
|
||
set COLORMAP=(-c $parm)
|
||
breaksw
|
||
endsw
|
||
unset flag
|
||
continue
|
||
endif
|
||
if ($parm =~ -*) then
|
||
switch ($parm)
|
||
case -g:
|
||
set flag=g
|
||
continue
|
||
case -p:
|
||
set flag=p
|
||
continue
|
||
case -P:
|
||
set SEARCHPATH=()
|
||
continue
|
||
case -R:
|
||
set flag=R
|
||
continue
|
||
case -C:
|
||
set COLORMAP=()
|
||
continue
|
||
case -c:
|
||
set flag=c
|
||
continue
|
||
endsw
|
||
else
|
||
set caesarfile=($caesarfile $parm)
|
||
endif
|
||
end
|
||
onintr -
|
||
$CAESAR -g $GRTERM $SEARCHPATH $COLORMAP $caesarfile
|
||
!Funky!Stuff!
|
||
echo x - bin/grindall
|
||
cat >bin/grindall <<'!Funky!Stuff!'
|
||
#
|
||
set flags=
|
||
set fileargs=
|
||
onintr cleanup
|
||
foreach file ($argv)
|
||
if ($file =~ -*) then
|
||
if ($file == -t) then
|
||
set stdout
|
||
else
|
||
set flags=($flags $file)
|
||
endif
|
||
else
|
||
set fileargs=($fileargs $file)
|
||
endif
|
||
end
|
||
|
||
if ($?stdout) then
|
||
foreach file ($fileargs)
|
||
vgrind -t $flags $file
|
||
end
|
||
else
|
||
foreach file ($fileargs)
|
||
vgrind -t $flags $file >> /usr/tmp/grind$$
|
||
end
|
||
vpr -T $fileargs[1] -t /usr/tmp/grind$$
|
||
endif
|
||
|
||
cleanup:
|
||
rm /usr/tmp/grind$$
|
||
!Funky!Stuff!
|
||
echo x - bin/hardasm
|
||
cat >bin/hardasm <<'!Funky!Stuff!'
|
||
#
|
||
grasm -1 -l -x $* |& pr -f -h "grasm -l -x $*" | vpr -l
|
||
!Funky!Stuff!
|
||
echo x - bin/hexvert
|
||
cat >bin/hexvert <<'!Funky!Stuff!'
|
||
#
|
||
if ($#argv == 0) then
|
||
set args=`cat`
|
||
if ($#args != 0) $0 $args
|
||
exit
|
||
endif
|
||
|
||
foreach decnum ($argv)
|
||
dc << EOF
|
||
16o
|
||
${decnum}p
|
||
EOF
|
||
end
|
||
!Funky!Stuff!
|
||
echo x - bin/job
|
||
cat >bin/job <<'!Funky!Stuff!'
|
||
PATH=/usr/ken/cmd/bin:/usr/ucb:/bin:/usr/bin
|
||
case $# in
|
||
0)
|
||
exec echo Usage: `basename $0` '-;' or $0 '<job description>' ;;
|
||
esac
|
||
case $1 in
|
||
-)
|
||
exec ex $HOME/.joblog ;;
|
||
-h | -hr | -hrs)
|
||
shift
|
||
hrs=$1
|
||
shift
|
||
exec echo ' job:' $hrs hours # $* >> $HOME/.joblog ;;
|
||
-tail)
|
||
exec tail -22 $HOME/.joblog ;;
|
||
-today)
|
||
{
|
||
while read line
|
||
do
|
||
case $line in
|
||
*login*)
|
||
login="$line" ;;
|
||
esac
|
||
done
|
||
echo -n "$login" "for "
|
||
diffdate "$login" "`date`"
|
||
} < $HOME/.joblog ;;
|
||
-login)
|
||
echo ' login:' "`date`" >> $HOME/.joblog ;;
|
||
-summary)
|
||
cat $HOME/.joblog |
|
||
while read line
|
||
do
|
||
case $line in
|
||
*login*)
|
||
login="$line" ;;
|
||
*logout*)
|
||
logout="$line"
|
||
echo -n "$login" "for "
|
||
diffdate "$login" "$logout"
|
||
esac
|
||
done ;;
|
||
*)
|
||
exec echo ' job:' "`date`" # $* >> $HOME/.joblog ;;
|
||
esac
|
||
!Funky!Stuff!
|
||
echo x - bin/ledger
|
||
cat >bin/ledger <<'!Funky!Stuff!'
|
||
#
|
||
set notetype=$0
|
||
set notetype=$notetype:t
|
||
set notefile=~/.$notetype
|
||
# if ($notetype == appt) then
|
||
# set notetype=appointment
|
||
# set notefile=~/calendar
|
||
# endif
|
||
|
||
if ($#argv == 0) then
|
||
test -t 0 && echo Please enter your $notetype entry '(^D to end):'
|
||
echo ' ' >> $notefile
|
||
exec cat >> $notefile
|
||
endif
|
||
|
||
switch ($1)
|
||
case -:
|
||
exec vi $notefile
|
||
case -rm:
|
||
cat /dev/null > $notefile
|
||
exec echo The ${notetype}s are removed.
|
||
case -what:
|
||
exec cat $notefile
|
||
default:
|
||
echo '' >> $notefile
|
||
echo "$*" >> $notefile
|
||
endsw
|
||
!Funky!Stuff!
|
||
echo x - bin/lstree
|
||
cat >bin/lstree <<'!Funky!Stuff!'
|
||
#
|
||
if ($#argv == 0) then
|
||
set root=.
|
||
else
|
||
set root=($*)
|
||
endif
|
||
exec find $root -print | sort | sed -e 's/[^ \/]*\// /g'
|
||
!Funky!Stuff!
|
||
echo x - bin/match
|
||
cat >bin/match <<'!Funky!Stuff!'
|
||
cat $2 |
|
||
while read x
|
||
do
|
||
for word in $x
|
||
do
|
||
case $word in
|
||
$1)
|
||
echo $word ;;
|
||
esac
|
||
done
|
||
done
|
||
!Funky!Stuff!
|
||
echo x - bin/narrow
|
||
cat >bin/narrow <<'!Funky!Stuff!'
|
||
echo \!
|
||
!Funky!Stuff!
|
||
echo x - bin/outmesg
|
||
cat >bin/outmesg <<'!Funky!Stuff!'
|
||
#
|
||
set notetype=$0
|
||
set notetype=$notetype:t
|
||
set notefile=~/.$notetype
|
||
# if ($notetype == appt) then
|
||
# set notetype=appointment
|
||
# set notefile=~/calendar
|
||
# endif
|
||
|
||
if ($#argv == 0) then
|
||
test -t 0 && echo Please enter your $notetype entry '(^D to end):'
|
||
echo ' ' >> $notefile
|
||
exec cat >> $notefile
|
||
endif
|
||
|
||
switch ($1)
|
||
case -:
|
||
exec vi $notefile
|
||
case -rm:
|
||
cat /dev/null > $notefile
|
||
exec echo The ${notetype}s are removed.
|
||
case -what:
|
||
exec cat $notefile
|
||
default:
|
||
echo '' >> $notefile
|
||
echo "$*" >> $notefile
|
||
endsw
|
||
!Funky!Stuff!
|
||
echo x - bin/path
|
||
cat >bin/path <<'!Funky!Stuff!'
|
||
IFS="${IFS}:"
|
||
for cmddir in $PATH
|
||
do
|
||
test -s $cmddir/$1 && echo " $cmddir/$1"
|
||
done
|
||
!Funky!Stuff!
|
||
echo x - bin/pphone
|
||
cat >bin/pphone <<'!Funky!Stuff!'
|
||
phonefile=$HOME/.`basename $0`s
|
||
|
||
echo ' '
|
||
|
||
case $# in
|
||
0)
|
||
ed - $phonefile << EOF
|
||
g/./s/$/\\
|
||
/
|
||
g/ /s//\\
|
||
/g
|
||
g/;/s// /g
|
||
1,\$p
|
||
q
|
||
EOF
|
||
exit ;;
|
||
esac
|
||
|
||
case $1 in
|
||
-)
|
||
chmod 644 $phonefile
|
||
vi $phonefile
|
||
chmod 444 $phonefile
|
||
exit ;;
|
||
esac
|
||
|
||
trap "rm /tmp/data$$; exit" 0 2
|
||
for name
|
||
do
|
||
grep -y "$name" $phonefile >> /tmp/data$$
|
||
done
|
||
ed - /tmp/data$$ << EOF
|
||
g/./s/$/\\
|
||
/
|
||
g/ /s//\\
|
||
/g
|
||
g/;/s// /g
|
||
1,\$p
|
||
q
|
||
EOF
|
||
!Funky!Stuff!
|
||
echo x - bin/progression
|
||
cat >bin/progression <<'!Funky!Stuff!'
|
||
last=
|
||
for backup in $1_??
|
||
do
|
||
case $last in
|
||
"")
|
||
last=$backup
|
||
continue;
|
||
esac
|
||
echo ''
|
||
echo From $last to $backup:
|
||
diff $last $backup
|
||
last=$backup
|
||
done
|
||
echo ''
|
||
echo From $last to $1:
|
||
diff $last $1
|
||
!Funky!Stuff!
|
||
echo x - bin/query
|
||
cat >bin/query <<'!Funky!Stuff!'
|
||
#
|
||
set notetype=$0
|
||
set notetype=$notetype:t
|
||
set notefile=~/.$notetype
|
||
# if ($notetype == appt) then
|
||
# set notetype=appointment
|
||
# set notefile=~/calendar
|
||
# endif
|
||
|
||
if ($#argv == 0) then
|
||
test -t 0 && echo Please enter your $notetype entry '(^D to end):'
|
||
echo ' ' >> $notefile
|
||
exec cat >> $notefile
|
||
endif
|
||
|
||
switch ($1)
|
||
case -:
|
||
exec vi $notefile
|
||
case -rm:
|
||
cat /dev/null > $notefile
|
||
exec echo The ${notetype}s are removed.
|
||
case -what:
|
||
exec cat $notefile
|
||
default:
|
||
echo '' >> $notefile
|
||
echo "$*" >> $notefile
|
||
endsw
|
||
!Funky!Stuff!
|
||
echo x - bin/releave
|
||
cat >bin/releave <<'!Funky!Stuff!'
|
||
#
|
||
set tty=`tty`
|
||
set tty=`expr $tty : '.*tty\(.*\)'`
|
||
set leaveproc=`ps gt$tty | grep -w leave`
|
||
kill -9 $leaveproc[1]
|
||
date
|
||
leave $*
|
||
!Funky!Stuff!
|
||
echo x - bin/reminder
|
||
cat >bin/reminder <<'!Funky!Stuff!'
|
||
#
|
||
set notetype=$0
|
||
set notetype=$notetype:t
|
||
set notefile=~/.$notetype
|
||
# if ($notetype == appt) then
|
||
# set notetype=appointment
|
||
# set notefile=~/calendar
|
||
# endif
|
||
|
||
if ($#argv == 0) then
|
||
test -t 0 && echo Please enter your $notetype entry '(^D to end):'
|
||
echo ' ' >> $notefile
|
||
exec cat >> $notefile
|
||
endif
|
||
|
||
switch ($1)
|
||
case -:
|
||
exec vi $notefile
|
||
case -rm:
|
||
cat /dev/null > $notefile
|
||
exec echo The ${notetype}s are removed.
|
||
case -what:
|
||
exec cat $notefile
|
||
default:
|
||
echo '' >> $notefile
|
||
echo "$*" >> $notefile
|
||
endsw
|
||
!Funky!Stuff!
|
||
echo x - bin/reremind
|
||
cat >bin/reremind <<'!Funky!Stuff!'
|
||
#
|
||
set tty=`tty`
|
||
set tty=`expr $tty : '.*tty\(.*\)'`
|
||
set leaveproc=`ps gt$tty | awk '$5 ~ /^remind$/ { print $1 }'`
|
||
if ($#leaveproc > 1) echo $#leaveproc reminds were running
|
||
kill -9 $leaveproc
|
||
date
|
||
if ($#argv <= 1) then
|
||
remind $*
|
||
else
|
||
set time=$1
|
||
shift
|
||
remind $time "$*"
|
||
endif
|
||
!Funky!Stuff!
|
||
echo x - bin/restore
|
||
cat >bin/restore <<'!Funky!Stuff!'
|
||
# Truncate filename if necessary
|
||
set file=$1
|
||
if (`expr $file:t : '.*'` >= 11) then
|
||
set savename=`expr $file : '\(.*\)'$file:t`
|
||
set savename=$savename`expr $file:t : '\(...........\)'`
|
||
else
|
||
set savename=$file
|
||
endif
|
||
|
||
switch ($#argv)
|
||
case 1:
|
||
set nonomatch
|
||
set backup=(${savename}_[0-9][0-9])
|
||
if ("$backup" == "${savename}_[0-9][0-9]") then
|
||
echo Error: No backups found for $file
|
||
exit
|
||
endif
|
||
set backup=$backup[$#backup]
|
||
echo No backup number specified. Using latest: $backup
|
||
breaksw
|
||
case 2:
|
||
set backup=${savename}_$2
|
||
breaksw
|
||
default:
|
||
exec echo Usage: `basename $0` '<file>' '[<backup number>]'
|
||
endsw
|
||
|
||
if ( { cp $backup $file } ) then
|
||
echo $file restored from $backup.
|
||
echo -n Do you wish to keep "$backup? "
|
||
set response=$<
|
||
if ($response !~ y*) then
|
||
rm $backup
|
||
endif
|
||
endif
|
||
!Funky!Stuff!
|
||
echo x - bin/rot13
|
||
cat >bin/rot13 <<'!Funky!Stuff!'
|
||
tr "A-Za-z" "N-ZA-Mn-za-m"
|
||
!Funky!Stuff!
|
||
echo x - bin/shufcol
|
||
cat >bin/shufcol <<'!Funky!Stuff!'
|
||
trap 'rm /tmp/$$.*; exit' 0 2
|
||
cat > /tmp/$$.0
|
||
i=1
|
||
for cols
|
||
do
|
||
cut -f$cols < /tmp/$$.0 > /tmp/$$.$i
|
||
filelist="$filelist /tmp/$$.$i"
|
||
i=`expr $i + 1`
|
||
done
|
||
paste $filelist
|
||
!Funky!Stuff!
|
||
echo x - bin/signature
|
||
cat >bin/signature <<'!Funky!Stuff!'
|
||
PATH=/bin:/usr/bin
|
||
cat
|
||
echo --
|
||
cat $HOME/.signature
|
||
!Funky!Stuff!
|
||
echo x - bin/swab
|
||
cat >bin/swab <<'!Funky!Stuff!'
|
||
#
|
||
if ($#argv == 0) then
|
||
dd conv=swab
|
||
else
|
||
onintr cleanup
|
||
foreach file ($argv)
|
||
cp $file /tmp/swab$$
|
||
dd if=/tmp/swab$$ of=$file conv=swab
|
||
end
|
||
cleanup:
|
||
rm /tmp/swab$$
|
||
endif
|
||
!Funky!Stuff!
|
||
echo x - bin/what
|
||
cat >bin/what <<'!Funky!Stuff!'
|
||
cat $HOME/.query
|
||
echo -n 'save? (n or d to delete, e to edit) '
|
||
read response
|
||
case $response in
|
||
n | no | d | delete)
|
||
rm $HOME/.query && echo The query is removed. ;;
|
||
"" | y | yes | s | save)
|
||
exit ;;
|
||
e | edit)
|
||
exec vi $HOME/.query < /dev/tty
|
||
exit ;;
|
||
*)
|
||
echo Bad response: "$response"
|
||
exec $0 ;;
|
||
esac
|
||
!Funky!Stuff!
|
||
echo x - bin/whereis
|
||
cat >bin/whereis <<'!Funky!Stuff!'
|
||
N=$#
|
||
command=echo
|
||
case "$1" in
|
||
-*)
|
||
command=`expr "$1" : '-\(.*\)'`
|
||
shift
|
||
N=`expr $N - 1` ;;
|
||
esac
|
||
case $N in
|
||
0)
|
||
exec echo Usage: `basename $0` [ -command ] pattern file ... ;;
|
||
1)
|
||
files=`fgrep -l "$1" *` ;;
|
||
*)
|
||
files=`fgrep -l "$@"` ;;
|
||
esac
|
||
case $files in
|
||
"")
|
||
echo $1 not found in any files.
|
||
exit ;;
|
||
esac
|
||
exec $command $files
|
||
!Funky!Stuff!
|
||
echo x - bin/wide
|
||
cat >bin/wide <<'!Funky!Stuff!'
|
||
echo \"
|
||
!Funky!Stuff!
|
||
echo x - bin/xprint
|
||
cat >bin/xprint <<'!Funky!Stuff!'
|
||
case $# in
|
||
1)
|
||
eval $1 | eval pr -f -h \"$1\" | vpr -l ;;
|
||
*)
|
||
command='cat $file'
|
||
for file
|
||
do
|
||
case $file in
|
||
-*)
|
||
command=`expr "$file" : '-\(.*\)'`
|
||
case $command in
|
||
*\$file*)
|
||
;;
|
||
*)
|
||
command="$command \$file" ;;
|
||
esac ;;
|
||
*)
|
||
eval $command | eval pr -f -h \"$command\" | vpr -l ;;
|
||
esac
|
||
done
|
||
esac
|
||
!Funky!Stuff!
|
||
echo x - bin/archives
|
||
mkdir bin/archives
|
||
echo x - bin/archives/newsweed
|
||
cat >bin/archives/newsweed <<'!Funky!Stuff!'
|
||
#
|
||
cd
|
||
if ($#argv == 0) then
|
||
if (-e .newsweed) then
|
||
set WEEDGROUPS=`cat .newsweed`
|
||
else
|
||
set WEEDGROUPS=
|
||
endif
|
||
else
|
||
set WEEDGROUPS=$*
|
||
endif
|
||
if ($#WEEDGROUPS == 0) then
|
||
onintr
|
||
echo Searching for articles in all newsgroups
|
||
readnews -l | \
|
||
grep Subject | \
|
||
sed -e 's/Subject: *//' -e 's/^[rR][eE]:* *//' | \
|
||
sort -u > /tmp/weed$$a
|
||
if (-z /tmp/weed$$a) then
|
||
echo No news.
|
||
else
|
||
cp /tmp/weed$$a /tmp/weed$$b
|
||
echo Please remove article titles which you do not wish to read
|
||
sleep 1
|
||
onintr -
|
||
vi /tmp/weed$$b
|
||
onintr cleanup
|
||
comm -23 /tmp/weed$$a /tmp/weed$$b > /tmp/weed$$c
|
||
echo Removing unwanted articles
|
||
newsec -f /tmp/weed$$c
|
||
endif
|
||
else
|
||
foreach group ($WEEDGROUPS)
|
||
echo Searching for articles in group\(s\):
|
||
echo $group
|
||
readnews -l -n $group | \
|
||
grep Subject | \
|
||
sed -e 's/Subject: *//' -e 's/^[rR]e:* *//' | \
|
||
sort -u > /tmp/weed$$a
|
||
if (-z /tmp/weed$$a) then
|
||
echo in newsgroups $group.
|
||
else
|
||
cp /tmp/weed$$a /tmp/weed$$b
|
||
echo Please remove article titles which you do not wish to read
|
||
sleep 1
|
||
onintr -
|
||
vi /tmp/weed$$b
|
||
onintr cleanup
|
||
comm -23 /tmp/weed$$a /tmp/weed$$b > /tmp/weed$$c
|
||
echo Removing unwanted articles
|
||
newsec -f /tmp/weed$$c
|
||
endif
|
||
end
|
||
endif
|
||
|
||
cleanup:
|
||
rm /tmp/weed$$?
|
||
!Funky!Stuff!
|
||
echo x - bin/archives/pk_01
|
||
cat >bin/archives/pk_01 <<'!Funky!Stuff!'
|
||
: Roff, nroff, or eqn input text
|
||
for file in `file $* | sed -n '/eqn input text$/s/:[^:]*$//p'`
|
||
do
|
||
echo "echo x - $file"
|
||
echo "sed 's/^x//' >$file <<'!Funky!Stuff!'"
|
||
sed 's/^/x/' $file; echo "!Funky!Stuff!"
|
||
done
|
||
: Text files
|
||
for file in `file $* | sed -n -e '/commands text$/s/:[^:]*$//p' -e '/ascii text$/s/:[^:]*$//p'`
|
||
do
|
||
echo "echo x - $file"
|
||
echo "cat >$file <<'!Funky!Stuff!'"
|
||
cat $file; echo "!Funky!Stuff!"
|
||
done
|
||
: Directories, recursively
|
||
for dir in `file $* | sed -n '/directory$/s/:.*//p'`
|
||
do
|
||
echo "echo x - $dir"
|
||
echo "mkdir $dir"
|
||
file=`echo $dir/*`
|
||
test "$file" != "$dir/*" && $0 $file
|
||
done
|
||
!Funky!Stuff!
|
||
echo x - bin/archives/pkf
|
||
cat >bin/archives/pkf <<'!Funky!Stuff!'
|
||
|
||
for dir
|
||
do
|
||
echo "echo x - $dir"
|
||
echo "mkdir $dir";
|
||
for file in `file $dir/* | sed -n '/text$/s/:[^:]*$//p'`
|
||
do
|
||
echo "echo x - $file"
|
||
echo "cat >$file <<'!Funky!Stuff!'"
|
||
cat $file; echo "!Funky!Stuff!"
|
||
done
|
||
$0 `file $dir/* | sed -n '/directory$/s/:.*//p'`
|
||
done
|
||
!Funky!Stuff!
|
||
echo x - bin/archives/pkg
|
||
cat >bin/archives/pkg <<'!Funky!Stuff!'
|
||
for file
|
||
do
|
||
echo "echo x - $file"
|
||
echo "cat >$file <<'!Funky!Stuff!'"
|
||
cat $file; echo "!Funky!Stuff!"
|
||
done
|
||
!Funky!Stuff!
|
||
echo x - bin/archives/pkn
|
||
cat >bin/archives/pkn <<'!Funky!Stuff!'
|
||
|
||
for dir
|
||
do
|
||
echo "echo x - $dir"
|
||
echo "mkdir $dir";
|
||
for file in `file $dir/* | sed -n '/text$/s/:[^:]*$//p'`
|
||
do
|
||
echo "echo x - $file"
|
||
echo "sed 's/^x//' >$file <<'!Funky!Stuff!'"
|
||
sed 's/^/x/' $file; echo "!Funky!Stuff!"
|
||
done
|
||
$0 `file $dir/* | sed -n '/directory$/s/:.*//p'`
|
||
done
|
||
!Funky!Stuff!
|
||
echo x - bin/archives/prod
|
||
cat >bin/archives/prod <<'!Funky!Stuff!'
|
||
#
|
||
set flags=()
|
||
set syslist=()
|
||
foreach arg ($argv)
|
||
switch ($arg)
|
||
case -s*:
|
||
if (`expr $arg : '.*'` > 9) then
|
||
rm -f /usr/spool/uucp/STST.`expr $arg : '-s\(.......\)'`
|
||
else
|
||
rm -f /usr/spool/uucp/STST.`expr $arg : '-s\(.*\)'`
|
||
endif
|
||
set syslist=($syslist $arg)
|
||
breaksw
|
||
case -*:
|
||
set flags=($flags $arg)
|
||
breaksw
|
||
default:
|
||
if (`expr $arg : '.*'` > 7) then
|
||
rm -f /usr/spool/uucp/STST.`expr $arg : '\(.......\)'`
|
||
else
|
||
rm -f /usr/spool/uucp/STST.$arg
|
||
endif
|
||
set syslist=($syslist -s$arg)
|
||
breaksw
|
||
endsw
|
||
end
|
||
foreach sys ($syslist)
|
||
/usr/lib/uucp/uucico -r1 $flags $sys
|
||
end
|
||
!Funky!Stuff!
|
||
echo x - bin/bourne_scripts
|
||
mkdir bin/bourne_scripts
|
||
echo x - bin/bourne_scripts/lookdoc
|
||
sed 's/^x//' >bin/bourne_scripts/lookdoc <<'!Funky!Stuff!'
|
||
xtrap exit 2
|
||
xcase $# in
|
||
x 0)
|
||
x ul | more
|
||
x exit ;;
|
||
xesac
|
||
xfor names
|
||
xdo
|
||
x case $names in
|
||
x -n)
|
||
x default=n ;;
|
||
x -t)
|
||
x default=t ;;
|
||
x -m*)
|
||
x macros="$macros $names" ;;
|
||
x *.n | *.nr)
|
||
x nroff $macros $names | ul | more ;;
|
||
x *.t | *.tbl)
|
||
x soelim $names | tbl | nroff $macros - | ul | more ;;
|
||
x *)
|
||
x case $default in
|
||
x n)
|
||
x nroff $macros $names | ul | more ;;
|
||
x t)
|
||
x soelim $names | tbl | nroff $macros - | ul | more ;;
|
||
x "")
|
||
x ul $names | more ;;
|
||
x esac
|
||
x esac
|
||
xdone
|
||
!Funky!Stuff!
|
||
echo x - bin/bourne_scripts/CC
|
||
cat >bin/bourne_scripts/CC <<'!Funky!Stuff!'
|
||
outname=a.out
|
||
for argv
|
||
do
|
||
case $argv in
|
||
*.[cos])
|
||
outname=`expr $argv : '\(.*\)\.'`
|
||
break ;;
|
||
esac
|
||
done
|
||
cc -o $outname $*
|
||
!Funky!Stuff!
|
||
echo x - bin/bourne_scripts/appt
|
||
cat >bin/bourne_scripts/appt <<'!Funky!Stuff!'
|
||
case $0 in
|
||
appt)
|
||
notetype=appointment
|
||
notefile=$HOME/calendar ;;
|
||
*)
|
||
notetype=$0
|
||
notefile=$HOME/.$0 ;;
|
||
esac
|
||
|
||
case $# in
|
||
0)
|
||
test -t 0 && echo Please enter your $notetype '(^D to end):'
|
||
echo '' >> $notefile
|
||
exec cat >> $notefile ;;
|
||
esac
|
||
case $1 in
|
||
-)
|
||
exec vi $notefile ;;
|
||
-rm)
|
||
cat /dev/null > $notefile
|
||
exec echo The ${notetype}s are removed. ;;
|
||
-what)
|
||
exec cat $notefile ;;
|
||
*)
|
||
echo '' >> $notefile
|
||
exec echo "$*" >> $notefile ;;
|
||
esac
|
||
!Funky!Stuff!
|
||
echo x - bin/bourne_scripts/beautify
|
||
cat >bin/bourne_scripts/beautify <<'!Funky!Stuff!'
|
||
for files
|
||
do
|
||
echo $files:
|
||
cb < $files > /tmp/cb$$
|
||
cat /tmp/cb$$ > $files
|
||
done
|
||
rm /tmp/cb$$
|
||
!Funky!Stuff!
|
||
echo x - bin/bourne_scripts/format
|
||
cat >bin/bourne_scripts/format <<'!Funky!Stuff!'
|
||
case $# in
|
||
0)
|
||
echo "Usage: `basename $0` [-flags] <filename> [ <filename> ... ]"
|
||
exit 1 ;;
|
||
esac
|
||
for names
|
||
do
|
||
case $names in
|
||
-*)
|
||
flags="$flags $names" ;;
|
||
*.t)
|
||
outfile=`expr $names : '\(.*\)\.'`.d
|
||
soelim $names | tbl | nroff $flags - > $outfile ;;
|
||
*.tbl)
|
||
outfile=`expr $names : '\(.*\)\.'`.doc
|
||
soelim $names | tbl | nroff $flags - > $outfile ;;
|
||
*.n)
|
||
outfile=`expr $names : '\(.*\)\.'`.d
|
||
nroff $flags $names > $outfile ;;
|
||
*.nr)
|
||
outfile=`expr $names : '\(.*\)\.'`.doc
|
||
nroff $flags $names > $outfile ;;
|
||
*)
|
||
echo Don\'t know what to do with $names ;;
|
||
esac
|
||
done
|
||
!Funky!Stuff!
|
||
echo x - bin/bourne_scripts/print
|
||
cat >bin/bourne_scripts/print <<'!Funky!Stuff!'
|
||
PATH=/avsd/ava/turk/bin:/usr/local/bin:/usr/bin
|
||
indent=0
|
||
for names
|
||
do
|
||
case $names in
|
||
-i)
|
||
indent=1 ;;
|
||
*)
|
||
args="$args $names" ;;
|
||
esac
|
||
done
|
||
case $indent in
|
||
0)
|
||
pr $args | lpr ;;
|
||
*)
|
||
pr $args | indent | lpr ;;
|
||
esac
|
||
!Funky!Stuff!
|
||
echo x - bin/bourne_scripts/repeat
|
||
cat >bin/bourne_scripts/repeat <<'!Funky!Stuff!'
|
||
case $1 in
|
||
-[0-9]*)
|
||
number=`expr $1 : '-\(.*\)'`
|
||
shift
|
||
while test $number -gt 0
|
||
do
|
||
eval $*
|
||
number=`expr $number - 1`
|
||
done
|
||
exit ;;
|
||
*)
|
||
echo Executing forever: $* 1>&2
|
||
number=0
|
||
trap 'echo Executed $number times.; exit' 2
|
||
while true
|
||
do
|
||
eval $*
|
||
number=`expr $number + 1`
|
||
done ;;
|
||
esac
|
||
!Funky!Stuff!
|
||
echo x - bin/bourne_scripts/restore
|
||
cat >bin/bourne_scripts/restore <<'!Funky!Stuff!'
|
||
case $# in
|
||
2) ;;
|
||
*)
|
||
exec echo Usage: `basename $0` '<file>' '<version>' ;;
|
||
esac
|
||
: Truncate filename if necessary
|
||
if test `expr $1 : '.*'` -gt 11
|
||
then
|
||
savename=`expr $1 : '\(...........\)'`
|
||
else
|
||
savename=$1
|
||
fi
|
||
savename=${savename}_$2
|
||
cp $savename $1 && rm $savename && echo $1 restored from $savename
|
||
!Funky!Stuff!
|
||
echo x - bin/bourne_scripts/save
|
||
cat >bin/bourne_scripts/save <<'!Funky!Stuff!'
|
||
for file
|
||
do
|
||
if test `expr $file : '.*'` -gt 11
|
||
then
|
||
savename=`expr $file : '\(...........\)'`
|
||
else
|
||
savename=$file
|
||
fi
|
||
for copy in ${savename}_??
|
||
do
|
||
latest=$copy
|
||
done
|
||
if test $latest = "${savename}_??"
|
||
then
|
||
latest=${savename}_01
|
||
else
|
||
latest=`expr $latest : '.*_\([0123456789]*\)$' + 1`
|
||
case $latest in
|
||
?)
|
||
latest=0$latest
|
||
;;
|
||
esac
|
||
latest=${savename}_$latest
|
||
fi
|
||
cp $file $latest && echo $file saved as $latest
|
||
done
|
||
!Funky!Stuff!
|
||
echo x - bin/csh_scripts
|
||
mkdir bin/csh_scripts
|
||
echo x - bin/csh_scripts/newsweed
|
||
cat >bin/csh_scripts/newsweed <<'!Funky!Stuff!'
|
||
#
|
||
set TEMP=/tmp/weed$$
|
||
set NEWSRC=~/.newsrc
|
||
set AWKFILE=/usr/ken/cmd/lib/newsweed.awk
|
||
onintr
|
||
echo Searching for articles in all newsgroups
|
||
readnews -l $* | sort -o ${TEMP}a
|
||
if (-z ${TEMP}a) then
|
||
echo No news.
|
||
else
|
||
cp ${TEMP}a ${TEMP}b
|
||
echo Please remove article titles which you do not wish to read
|
||
sleep 1
|
||
onintr -
|
||
vi ${TEMP}b
|
||
onintr cleanup
|
||
if ( { cmp -s ${TEMP}a ${TEMP}b } ) then
|
||
echo No articles deleted.
|
||
else
|
||
comm -23 ${TEMP}a ${TEMP}b | sed 's/ .*//' > ${TEMP}c
|
||
echo Removing unwanted articles
|
||
cp $NEWSRC $NEWSRC.old
|
||
awk -f $AWKFILE $NEWSRC.old ${TEMP}c > ${TEMP}d
|
||
cp ${TEMP}d $NEWSRC
|
||
endif
|
||
endif
|
||
cleanup:
|
||
rm ${TEMP}?
|
||
!Funky!Stuff!
|
||
echo x - bin/csh_scripts/pathname
|
||
cat >bin/csh_scripts/pathname <<'!Funky!Stuff!'
|
||
#
|
||
foreach cmddir ($path)
|
||
if ( -e $cmddir/$1 ) echo " $cmddir/$1"
|
||
end
|
||
!Funky!Stuff!
|
||
echo x - bin/local
|
||
mkdir bin/local
|
||
echo x - bin/local/format
|
||
cat >bin/local/format <<'!Funky!Stuff!'
|
||
#
|
||
if ($#argv == 0) then
|
||
set progname=$0
|
||
set progname=$progname:t
|
||
echo 'Usage:' $progname '[-v] [-n] [-print] [-troffflags] <filename> [ <filename> ... ]'
|
||
exit (1)
|
||
endif
|
||
set flags
|
||
set formatter="vtroff -t"
|
||
set eqnsetter=eqn
|
||
set docsuf=v
|
||
set longdocsuf=vpr
|
||
set more=0
|
||
foreach name ($argv)
|
||
if ($more > 0) then
|
||
set flags="$flags $name"
|
||
@ more--
|
||
continue
|
||
endif
|
||
switch ($name)
|
||
case -*:
|
||
switch ($name)
|
||
case -print:
|
||
set print
|
||
continue
|
||
case -v:
|
||
set formatter="vtroff -t"
|
||
set eqnsetter=eqn
|
||
set docsuf=v
|
||
set longdocsuf=vpr
|
||
continue
|
||
case -n:
|
||
set formatter=nroff
|
||
set eqnsetter=neqn
|
||
set docsuf=d
|
||
set longdocsuf=doc
|
||
continue
|
||
case -[F123]:
|
||
set more=1
|
||
default:
|
||
set flags="$flags $name"
|
||
endsw
|
||
continue
|
||
case *.et:
|
||
set outfile=$name:r.$docsuf
|
||
eval soelim $name | tbl | $eqnsetter | $formatter $flags > $outfile
|
||
breaksw
|
||
case *.t:
|
||
set outfile=$name:r.$docsuf
|
||
eval soelim $name | tbl | $formatter $flags > $outfile
|
||
breaksw
|
||
case *.tbl:
|
||
set outfile=$name:r.$longdocsuf
|
||
eval soelim $name | tbl | $formatter $flags > $outfile
|
||
breaksw
|
||
case *.e:
|
||
set outfile=$name:r.$docsuf
|
||
eval $eqnsetter $name | $formatter $flags > $outfile
|
||
breaksw
|
||
case *.eqn:
|
||
set outfile=$name:r.$longdocsuf
|
||
eval $eqnsetter $name | $formatter $flags > $outfile
|
||
breaksw
|
||
case *.n:
|
||
set outfile=$name:r.$docsuf
|
||
eval $formatter $flags $name > $outfile
|
||
breaksw
|
||
case *.nr:
|
||
set outfile=$name:r.$longdocsuf
|
||
eval $formatter $flags $name > $outfile
|
||
breaksw
|
||
default:
|
||
echo Don\'t know what to do with $name
|
||
continue
|
||
endsw
|
||
if ($?print) then
|
||
if ("$formatter" == nroff) then
|
||
vpr $outfile
|
||
else
|
||
vpr -t $outfile
|
||
endif
|
||
endif
|
||
end
|
||
!Funky!Stuff!
|
||
echo x - bin/local/lntree
|
||
cat >bin/local/lntree <<'!Funky!Stuff!'
|
||
PATH=/usr/local/bin:/usr/ucb:/bin:/usr/bin
|
||
if test $1 = -v
|
||
then
|
||
verbose=1
|
||
shift
|
||
else
|
||
verbose=0
|
||
fi
|
||
case $2 in
|
||
/*)
|
||
target=$2 ;;
|
||
*)
|
||
target=`pwd`/$2 ;;
|
||
esac
|
||
if test -f $2
|
||
then
|
||
echo Error: $2 is not a directory
|
||
exit 1
|
||
fi
|
||
cd $1
|
||
source=`pwd`
|
||
if test `expr $target : $source/` != 0
|
||
then
|
||
echo Error: $2 may be a subdirectory of $1
|
||
echo Try using the full path name of $2 \(no ..\'s\)
|
||
exit 1
|
||
fi
|
||
if test $verbose = 1
|
||
then
|
||
set -x
|
||
fi
|
||
files=`type -f`
|
||
case $files in
|
||
"") ;;
|
||
*)
|
||
ln $files $target ;;
|
||
esac
|
||
for directory in `find '' -type d -a -print`
|
||
do
|
||
mkdir $target$directory
|
||
cd $source$directory
|
||
files=`type -f`
|
||
case $files in
|
||
"") ;;
|
||
*)
|
||
ln $files $target$directory ;;
|
||
esac
|
||
done
|
||
!Funky!Stuff!
|
||
echo x - bin/local/lookdoc
|
||
cat >bin/local/lookdoc <<'!Funky!Stuff!'
|
||
#
|
||
if ($#argv == 0) then
|
||
more
|
||
exit
|
||
endif
|
||
set macros pipespec args
|
||
foreach name ($argv)
|
||
switch ($name)
|
||
case -n:
|
||
set pipespec=n
|
||
breaksw
|
||
case -t:
|
||
set pipespec=t
|
||
breaksw
|
||
case -m*:
|
||
set macros="$macros $name"
|
||
breaksw
|
||
case *.n:
|
||
case *.nr:
|
||
if ($pipespec != t) set pipespec=n
|
||
set args="$args $name"
|
||
breaksw
|
||
case *.t:
|
||
case *.tbl:
|
||
set pipespec=t
|
||
set args="$args $name"
|
||
breaksw
|
||
default:
|
||
set args="$args $name"
|
||
endsw
|
||
end
|
||
|
||
switch ($pipespec)
|
||
case n:
|
||
nroff $macros $args | more
|
||
breaksw
|
||
case t:
|
||
soelim $args | tbl | nroff $macros - | col | more
|
||
breaksw
|
||
default:
|
||
more $name
|
||
breaksw
|
||
endsw
|
||
!Funky!Stuff!
|
||
echo x - bin/local/newsweed
|
||
cat >bin/local/newsweed <<'!Funky!Stuff!'
|
||
TEMP=/tmp/weed$$
|
||
NEWSRC=$HOME/.newsrc
|
||
AWKFILE=/usr/local/lib/newsweed.awk
|
||
trap 'rm ${TEMP}?; exit' 0 2
|
||
echo Making list of article titles
|
||
readnews -l $* | sort -o ${TEMP}a
|
||
if test -s ${TEMP}a
|
||
then
|
||
cp ${TEMP}a ${TEMP}b
|
||
echo Please remove article titles which you do not wish to read
|
||
sleep 1
|
||
reset # So that vi's CRLF doesn't get trashed by another vi
|
||
${EDITOR-vi} ${TEMP}b
|
||
if cmp -s ${TEMP}a ${TEMP}b
|
||
then
|
||
echo No articles deleted.
|
||
else
|
||
comm -23 ${TEMP}a ${TEMP}b | sed 's/ .*//' > ${TEMP}c
|
||
echo Removing unwanted articles
|
||
cp $NEWSRC $NEWSRC.old
|
||
awk -f $AWKFILE $NEWSRC.old ${TEMP}c > ${TEMP}d
|
||
cp ${TEMP}d $NEWSRC
|
||
fi
|
||
else
|
||
echo No news.
|
||
fi
|
||
!Funky!Stuff!
|
||
echo x - bin/local/nmail
|
||
cat >bin/local/nmail <<'!Funky!Stuff!'
|
||
#/bin/csh
|
||
set found = 0
|
||
set arg = 1
|
||
while($arg <= $#argv)
|
||
if(`echo $argv[$arg] | grep \!` != "") then
|
||
set tuple = `echo $argv[$arg] | sed s/\\!/\ /`
|
||
set upath = `uupath $tuple[1]`
|
||
set found = $status
|
||
set argv[$arg] = "$upath\!$tuple[2]"
|
||
else
|
||
set found = 0
|
||
endif
|
||
if($found != 0) then
|
||
set argv[$arg]
|
||
endif
|
||
@ arg = $arg + 1
|
||
end
|
||
echo "mail $argv"
|
||
mail $argv
|
||
|
||
!Funky!Stuff!
|
||
echo x - bin/local/peopledata
|
||
cat >bin/local/peopledata <<'!Funky!Stuff!'
|
||
peoplefile=$HOME/.peopledata
|
||
|
||
echo ' '
|
||
|
||
case $# in
|
||
0)
|
||
ed - $peoplefile << EOF
|
||
g/./s/$/\\
|
||
/
|
||
g/ /s//\\
|
||
/g
|
||
1,\$p
|
||
q
|
||
EOF
|
||
exit ;;
|
||
esac
|
||
|
||
case $1 in
|
||
-)
|
||
chmod 600 $peoplefile
|
||
vi $peoplefile
|
||
chmod 400 $peoplefile
|
||
exit ;;
|
||
esac
|
||
trap "rm /tmp/data$$; exit" 0 2
|
||
for name
|
||
do
|
||
grep -y "$name" $peoplefile >> /tmp/data$$
|
||
done
|
||
ed - /tmp/data$$ << EOF
|
||
g/./s/$/\\
|
||
/
|
||
g/ /s//\\
|
||
/g
|
||
1,\$p
|
||
q
|
||
EOF
|
||
!Funky!Stuff!
|
||
echo x - bin/local/phone
|
||
cat >bin/local/phone <<'!Funky!Stuff!'
|
||
peoplefile=$HOME/.peopledata
|
||
|
||
case $# in
|
||
0)
|
||
ed - $peoplefile << EOF
|
||
v/-/d
|
||
g/./s/\([^ ]*\)[^-]* \(.*-.*\)/\1 \2/
|
||
1,\$p
|
||
EOF
|
||
exit ;;
|
||
esac
|
||
|
||
case $1 in
|
||
-)
|
||
chmod 600 $peoplefile
|
||
vi $peoplefile
|
||
chmod 400 $peoplefile
|
||
exit ;;
|
||
esac
|
||
|
||
trap "rm /tmp/data$$; exit" 0 2
|
||
for name
|
||
do
|
||
grep -y "$name" $peoplefile >> /tmp/data$$
|
||
done
|
||
ed - /tmp/data$$ << EOF
|
||
g/./s/\([^ ]*\)[^-]* \(.*-.*\)/\1 \2/
|
||
1,\$p
|
||
q
|
||
EOF
|
||
!Funky!Stuff!
|
||
echo x - bin/local/pk
|
||
cat >bin/local/pk <<'!Funky!Stuff!'
|
||
for dir
|
||
do echo "mkdir $dir";
|
||
for file in `file $dir/* | sed -n '/text$/s/:[^:]*$//p'`
|
||
do echo "echo x - $file"
|
||
echo "cat >$file <<'#EOF#'"
|
||
cat $file; echo "#EOF#"
|
||
done
|
||
pk `file $dir/* | sed -n '/directory$/s/:.*//p'`
|
||
done
|
||
!Funky!Stuff!
|
||
echo x - bin/local/save
|
||
cat >bin/local/save <<'!Funky!Stuff!'
|
||
#
|
||
if ("$1" =~ -*) then
|
||
set suffix=`expr $1 : '-\(.*\)'`
|
||
shift
|
||
foreach file ($argv)
|
||
if (`expr $file:t : '.*'` >= 11) then
|
||
set savename=`expr $file : '\(.*\)'$file:t`
|
||
set savename=$savename`expr $file:t : '\(...........\)'`
|
||
else
|
||
set savename=$file
|
||
endif
|
||
cp $file ${savename}_$suffix && \
|
||
echo $file saved as ${savename}_$suffix
|
||
end
|
||
exit
|
||
endif
|
||
foreach file ($argv)
|
||
if (`expr $file:t : '.*'` >= 11) then
|
||
set savename=`expr $file : '\(.*\)'$file:t`
|
||
set savename=$savename`expr $file:t : '\(...........\)'`
|
||
else
|
||
set savename=$file
|
||
endif
|
||
|
||
set nonomatch
|
||
set latest=(${savename}_[0-9][0-9])
|
||
if ("$latest" == "${savename}_[0-9][0-9]") then
|
||
set latest=${savename}_01
|
||
else
|
||
set latest=$latest[$#latest]
|
||
set latest=`expr $latest : '.*_\([0123456789]*\)$' + 1`
|
||
if ($latest < 10) set latest=0$latest
|
||
set latest=${savename}_$latest
|
||
endif
|
||
cp $file $latest && echo $file saved as $latest
|
||
end
|
||
!Funky!Stuff!
|
||
echo x - bin/local/shar
|
||
cat >bin/local/shar <<'!Funky!Stuff!'
|
||
: Roff, nroff, or eqn input text
|
||
for file in `file $* | sed -n '/eqn input text$/s/:[^:]*$//p'`
|
||
do
|
||
echo "echo x - $file"
|
||
echo "sed 's/^x//' >$file <<'!Funky!Stuff!'"
|
||
sed 's/^/x/' $file; echo "!Funky!Stuff!"
|
||
done
|
||
: Text files
|
||
for file in `file $* | sed -n -e '/eqn input text$/d' -e '/text$/s/:[^:]*$//p'`
|
||
do
|
||
echo "echo x - $file"
|
||
echo "cat >$file <<'!Funky!Stuff!'"
|
||
cat $file; echo "!Funky!Stuff!"
|
||
done
|
||
: Directories, recursively
|
||
for dir in `file $* | sed -n '/directory$/s/:.*//p'`
|
||
do
|
||
echo "echo x - $dir"
|
||
echo "mkdir $dir"
|
||
file=`echo $dir/*`
|
||
test "$file" != "$dir/*" && $0 $file
|
||
done
|
||
!Funky!Stuff!
|
||
echo x - bin/local/uuhosts
|
||
cat >bin/local/uuhosts <<'!Funky!Stuff!'
|
||
#!/bin/sh
|
||
# '@(#) uuhosts.sh 1.22 84/08/07'
|
||
|
||
# PATH will have to be adjusted for non-BSD systems.
|
||
PATH=/usr/local/bin:/usr/ucb:/bin:/usr/bin
|
||
LIB=/usr/lib
|
||
|
||
# Routing information produced by pathalias.
|
||
paths=$LIB/nmail.paths
|
||
|
||
# The directory $NEWSMAP should contain the USENET news map information
|
||
# from newsgroup net.news.map that is posted about once a month from
|
||
# cbosgd!map, extracted by a line like this in $LIB/news/sys:
|
||
#
|
||
# newsmap:net.news.map:B:/usr/local/uuhosts -x
|
||
#
|
||
# Locally-known information should go in $LIB/news/net.news.map/Local.
|
||
# The directory $MAILMAP is extracted by the same command from the
|
||
# UUCP mail information posted to the same newsgroup.
|
||
NEWSMAP=$LIB/news/net.news.map
|
||
MAILMAP=$LIB/news/net.mail.map
|
||
cd $NEWSMAP
|
||
|
||
case $1 in
|
||
-x)
|
||
# extract a new map piece into the map directory
|
||
temphead=/tmp/maphead.$$
|
||
temptext=/tmp/maptext.$$
|
||
awk '
|
||
BEGIN {
|
||
temphead = "'$temphead'";
|
||
isnewsmap = 0; ismailmap = 0;
|
||
shead = 0; stext = 1; snews = 2; smail = 3; scat = 4; scatting = 5;
|
||
state = shead;
|
||
print "Reply-To: news" >> temphead;
|
||
}
|
||
state == shead && /^From: / {
|
||
print "Original-" $0 >> temphead;
|
||
}
|
||
state == shead && /^Subject: / {
|
||
if ($2 != "Re:")
|
||
for (x = 2; x <= NF; x++) {
|
||
if ($x == "UUCPmap" || $x == "uucpmap" || $x == "UUCPMAP") {
|
||
ismailmap = 1;
|
||
break;
|
||
}
|
||
if ($x == "map" || $x == "Map" || $x == "MAP") {
|
||
if (x <= 2)
|
||
continue;
|
||
x--;
|
||
if ($x == "USENET") {
|
||
isnewsmap = 1;
|
||
break;
|
||
}
|
||
if ($x == "UUCP") {
|
||
ismailmap = 1;
|
||
break;
|
||
}
|
||
x++;
|
||
}
|
||
}
|
||
if (!isnewsmap && !ismailmap) {
|
||
print "Subject: not a map update" >> temphead;
|
||
print "Original-" $0 >> temphead;
|
||
} else
|
||
print $0 >> temphead;
|
||
}
|
||
state == shead && /^$/ {
|
||
if (isnewsmap != 0)
|
||
state = snews;
|
||
else if (ismailmap != 0) {
|
||
state = scat;
|
||
} else
|
||
state = stext;
|
||
next;
|
||
}
|
||
state == scat {
|
||
if ($1 != "cat")
|
||
state = scatting;
|
||
else
|
||
state = smail;
|
||
}
|
||
state == scatting {
|
||
if ($1 == ":")
|
||
state = smail;
|
||
else
|
||
print;
|
||
}
|
||
state == smail {
|
||
print | "uuhosts -u";
|
||
}
|
||
state == snews {
|
||
print | "/bin/sh";
|
||
}
|
||
state == stext {
|
||
print;
|
||
}
|
||
' > $temptext 2>&1
|
||
cat $temphead $temptext | /bin/mail news
|
||
rm -f $temphead $temptext
|
||
exit 0
|
||
;;
|
||
|
||
-u)
|
||
# extract a UUCP map piece
|
||
cd $MAILMAP
|
||
/bin/sh
|
||
for f in *map*.a *map*.ar
|
||
do
|
||
ar xv $f
|
||
rm $f
|
||
done
|
||
;;
|
||
|
||
-g)
|
||
# by geographical region
|
||
shift
|
||
if test $# -eq 0
|
||
then
|
||
exec ls
|
||
exit 1
|
||
fi
|
||
exec cat $*
|
||
exit 1
|
||
;;
|
||
|
||
-k)
|
||
# by keyword
|
||
shift
|
||
exec awk '
|
||
BEGIN { inside = 1; outside = 0; state = outside; }
|
||
/^Name:/ { state = inside; count = 0; useit = 0; }
|
||
state == inside { block[count++] = $0; }
|
||
/'"$*"'/ { useit = 1; }
|
||
/^$/ && state == inside {
|
||
if (useit == 1) {
|
||
for (i = 0; i < count; i++) {
|
||
print block[i];
|
||
}
|
||
}
|
||
state = outside;
|
||
}
|
||
' *
|
||
exit 1
|
||
;;
|
||
|
||
-*)
|
||
# unknown option
|
||
;;
|
||
|
||
"")
|
||
# no arguments
|
||
;;
|
||
|
||
*)
|
||
# by site name
|
||
for arg in $*
|
||
do
|
||
echo 'UUCP mail path:'
|
||
grep '^'${arg} $paths
|
||
echo '
|
||
UUCP mail host information:'
|
||
cat $MAILMAP/${arg}* | tr % '\012'
|
||
echo '
|
||
USENET news host information:'
|
||
sed -n -e "/^Name:[ ]*${arg}/,/^$/p" *
|
||
done
|
||
exit 0
|
||
;;
|
||
esac
|
||
|
||
echo 'Usage: 'uuhosts' hostname ...
|
||
for information about a particular UUCP or USENET host or hosts, or
|
||
|
||
'uuhosts' -g geographical-region
|
||
for information about USENET news sites in a geographical region, or
|
||
|
||
'uuhosts' -g
|
||
for a list of known USENET geographical-regions.
|
||
'
|
||
exit 1
|
||
!Funky!Stuff!
|
||
|
||
::::::::::::::
|
||
shells/4
|
||
::::::::::::::
|
||
Date: Fri, 14 Sep 84 15:06:07 pdt
|
||
From: hplabs!sdcrdcf!sdcsvax!celerity!barto (David Barto)
|
||
To: sdcsvax!sdcrdcf!hplabs!resonex!nancy
|
||
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like
|
||
|
||
Hi Nancy,
|
||
I too am a 'new' system admin, and belive me, it won't take
|
||
you too long to get quite a bag of tricks put together.
|
||
|
||
Most of mine relate to source programs put together in
|
||
shell scripts to keep track of things.
|
||
|
||
I have 1 for news (at the end of the article) which keeps
|
||
the active list up to date.
|
||
|
||
Another nice program is one I call '#'. It is owned by root
|
||
and setuid/setgid to root/daemon. I use it to 'become' root
|
||
while doing 1 command
|
||
# mv file1 file2
|
||
which requires root permission. It checks to see the normal
|
||
userid is 'me' and then allows the command. I will send it
|
||
along if you want it.
|
||
|
||
I have shell scripts for doing things such as 'rootedit'
|
||
a file. This is an alias for "alias re '# vi -v \!*'"
|
||
|
||
I too would love to see the things you get back from the
|
||
net. As well I have a sendmail config setup for making
|
||
your configuration a breeze. If you want it I can send
|
||
it under seperate cover.
|
||
|
||
|
||
barto (david barto) Tele : (619) 271 9940
|
||
uucp : {decvax || ucbvax || ihnp4}!sdcsvax!celerity!barto
|
||
uucp : akgua!celerity!barto
|
||
arpa : sdcsvax!celerity!barto@NOSC
|
||
|
||
|
||
: This is a shar archive. Extract with sh, not csh.
|
||
echo x - Mkactive
|
||
cat > Mkactive << '!Funky!Stuff!'
|
||
#!/bin/sh
|
||
# see Update.active for this usage
|
||
#
|
||
sed -e '1,/---/d'\
|
||
-e '1,/---/d'\
|
||
-e 's/^[ ]//'\
|
||
-e 's/ \(.*\)//'\
|
||
active.current | sort | sed -e '1,/Newsgroup/d' > current
|
||
sed -e 's/ \(.*\)//' /usr/new/lib/news/active | sort > active
|
||
diff active current > /tmp/active.diff
|
||
echo "# active newsgroups not in local active file:"
|
||
fgrep ">" /tmp/active.diff
|
||
echo "# defunct newsgroups still in active file (also local groups):"
|
||
fgrep "<" /tmp/active.diff
|
||
/bin/rm current active /tmp/active.diff
|
||
!Funky!Stuff!
|
||
echo x - Mkdead
|
||
cat > Mkdead << '!Funky!Stuff!'
|
||
#!/bin/sh
|
||
# see Update.active for usage
|
||
# change all groups that we have (but shouldn't) to be removed,
|
||
# and change all groups that we dont have (but sould) to be a comment
|
||
sed -e '/general/d'\
|
||
-e '/control/d' \
|
||
-e '/junk/d' \
|
||
-e 's/</rmgroup/' \
|
||
-e 's/>/#/'
|
||
!Funky!Stuff!
|
||
echo x - rmgroup
|
||
cat > rmgroup << '!Funky!Stuff!'
|
||
#! /bin/sh
|
||
# from : sdcsvax!sdcrdcf!hplabs!hao!seismo!rlgvax!cvl!umcp-cs!eneevax!chris
|
||
#
|
||
# @(#)rmgroup.sh (U of Maryland) FLB 28-Jun-1983
|
||
# Bug fixes 5 June 1984 Chris Torek
|
||
#
|
||
# Delete a newsgroup
|
||
|
||
lib=/usr/new/lib/news
|
||
spool=/usr/spool/news
|
||
|
||
group=$*
|
||
|
||
for group
|
||
do
|
||
qgrp="`echo $group | sed 's/\./\\\./g'`"
|
||
if
|
||
grep -s "^$qgrp [0-9][0-9][0-9][0-9][0-9]$" $lib/active
|
||
then
|
||
ed - $lib/active << xxxFOOxxx
|
||
/^$qgrp [0-9][0-9][0-9][0-9][0-9]$/d
|
||
w
|
||
q
|
||
xxxFOOxxx
|
||
else
|
||
echo "$0: $group: no such active line" 2>&1
|
||
fi
|
||
|
||
dir=$spool/"`echo $group | sed 's/\./\//g'`"
|
||
if
|
||
[ -d "$dir" ]
|
||
then
|
||
/bin/rm -fr "$dir"
|
||
else
|
||
echo "$0: $dir: no spool directory" 2>&1
|
||
fi
|
||
done
|
||
exit 0
|
||
!Funky!Stuff!
|
||
|
||
::::::::::::::
|
||
shells/5
|
||
::::::::::::::
|
||
Date: Thu, 20 Sep 84 01:20:29 pdt
|
||
From: turtlevax!ken (Ken Turkowski)
|
||
To: resonex!nancy
|
||
Subject: Handy new uucp utility: uuque
|
||
|
||
cat << EOF
|
||
I just completed a new useful uucp utility which lets you know what kind
|
||
of uucp work is in progress. While uusnap just tells you the number of
|
||
files to be processed, uuque tells you exactly what kind of work is to
|
||
be performed. I've only tried it on three kinds of work, namely mail,
|
||
news, and standard uucp transfers. Give it a try, and see if it breaks
|
||
on any new types of uucp work.
|
||
Ken
|
||
P.S. This really should be a C program.
|
||
EOF
|
||
echo x - uuque
|
||
cat >uuque <<'!Funky!Stuff!'
|
||
#! /bin/sh
|
||
# uusnap
|
||
cd /usr/spool/uucp
|
||
LUUNAME=`uuname -l`
|
||
|
||
# Check for outgoing work
|
||
for cmdfile in C./*
|
||
do
|
||
test -f $cmdfile || continue
|
||
othersys=`expr $cmdfile : 'C./C.\(.*\).....'`
|
||
cmd=
|
||
dfile=
|
||
xfile=
|
||
ufile=
|
||
cat $cmdfile | {
|
||
while read cmd arg1 arg2 arg3 extra
|
||
do
|
||
case $cmd in
|
||
S) ;;
|
||
*) echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $arg3 $extra
|
||
exit ;;
|
||
esac
|
||
case $arg1 in
|
||
D.${LUUNAME}X????) # Remote execute file
|
||
xfile=$arg1
|
||
;;
|
||
D.${LUUNAME}?????) # Data file ref'd by the execute file
|
||
dfile=$arg1
|
||
;;
|
||
*) # Just a uucp
|
||
dfile=$arg1
|
||
ufile=$arg2
|
||
from=$arg3
|
||
;;
|
||
esac
|
||
done
|
||
case $xfile in
|
||
"") # uucp transfer
|
||
echo `wc -c < $dfile`\ uucp $dfile $othersys!$ufile \($from\)
|
||
;;
|
||
*) # complex transfer
|
||
cat D.${LUUNAME}X/$xfile | {
|
||
while read xcmd arg1 arg2 extra
|
||
do
|
||
case $xcmd in
|
||
U)
|
||
from=$arg2!$arg1
|
||
;;
|
||
F)
|
||
;;
|
||
I)
|
||
;;
|
||
C)
|
||
echo `wc -c < D.${LUUNAME}/$dfile`\ $arg1 $othersys!$arg2 \($from\)
|
||
;;
|
||
*)
|
||
echo Unknown xcmd in $xfile: $xcmd $arg1 $arg2
|
||
exit
|
||
;;
|
||
esac
|
||
done
|
||
}
|
||
;;
|
||
esac
|
||
}
|
||
done
|
||
|
||
# Check for incoming work
|
||
for cmdfile in X./*
|
||
do
|
||
test -f $cmdfile || continue
|
||
othersys=`expr $cmdfile : 'X./X.\(.*\).....'`
|
||
cat $cmdfile | {
|
||
while read cmd arg1 arg2 extra
|
||
do
|
||
case $cmd in
|
||
U)
|
||
from=$arg2!$arg1
|
||
;;
|
||
Z)
|
||
;;
|
||
F)
|
||
if test -f D./$arg1
|
||
then
|
||
dfile=D./$arg1
|
||
elif test -f D./$arg2
|
||
then
|
||
dfile=D./$arg2
|
||
else
|
||
continue 2
|
||
fi
|
||
;;
|
||
C)
|
||
xcmd=$arg1
|
||
;;
|
||
*) echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $extra
|
||
exit ;;
|
||
esac
|
||
done
|
||
echo `wc -c < $dfile`\ $xcmd $dfile \($from\)
|
||
}
|
||
done
|
||
!Funky!Stuff!
|
||
|
||
::::::::::::::
|
||
shells/6
|
||
::::::::::::::
|
||
Date: Sat, 22 Sep 84 01:22:39 pdt
|
||
From: turtlevax!ken (Ken Turkowski)
|
||
To: resonex!nancy
|
||
Subject: Re: uuque
|
||
|
||
I've updated uuque to the point where it should probably instead be called
|
||
uusnoop. Of course, it's not that interesting unless there are others on
|
||
your system that use uucp and net mail.
|
||
|
||
Ken
|
||
|
||
echo x - uuque
|
||
cat >uuque <<'!Funky!Stuff!'
|
||
#! /bin/sh
|
||
# The user must have access to the /usr/spool/uucp/* directories and files.
|
||
# This can be easily done by making certain users members of the daemon
|
||
# and/or uucp groups, or by becoming super-user.
|
||
# uusnap
|
||
cd /usr/spool/uucp
|
||
LUUNAME=`uuname -l`
|
||
|
||
# Check for outgoing work
|
||
for cmdfile in C./*
|
||
do
|
||
test -f $cmdfile || continue
|
||
othersys=`expr $cmdfile : 'C./C.\(.*\).....'`
|
||
cmd=
|
||
dfile=
|
||
xfile=
|
||
ufile=
|
||
cat $cmdfile | {
|
||
while read cmd arg1 arg2 arg3 extra
|
||
do
|
||
case $cmd in
|
||
S) # uucp send
|
||
case $arg1 in
|
||
D.${LUUNAME}X????) # Remote execute file
|
||
xfile=$arg1
|
||
;;
|
||
D.${LUUNAME}?????) # Data file ref'd by xfile
|
||
dfile=D.${LUUNAME}/$arg1
|
||
;;
|
||
*) # Just a uucp -- no intertpretation
|
||
echo `wc -c < $arg1`\ uucp $arg1 $othersys!$arg2 \($arg3\)
|
||
;;
|
||
esac
|
||
;;
|
||
R) # uucp receive
|
||
echo ' ' uucp $othersys!$arg1 $arg2 \($arg3\)
|
||
;;
|
||
*) echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $arg3 $extra
|
||
continue ;;
|
||
esac
|
||
done
|
||
case $xfile in
|
||
"") # uucp transfer
|
||
continue
|
||
;;
|
||
esac
|
||
cat D.${LUUNAME}X/$xfile | { # complex transfer -- interpret xfile
|
||
while read xcmd arg1 arg2 extra
|
||
do
|
||
case $xcmd in
|
||
U)
|
||
from=$arg2!$arg1
|
||
;;
|
||
F)
|
||
;;
|
||
I)
|
||
;;
|
||
Z)
|
||
;;
|
||
C)
|
||
case $arg1 in
|
||
rmail)
|
||
from=`head -1 $dfile | ( read arg1 arg2 extra; echo $arg2 )`
|
||
echo `wc -c < $dfile`\ $arg1 $othersys!$arg2 \($from\)
|
||
echo -n ' '
|
||
grep '^Subject:' $dfile || echo ''
|
||
;;
|
||
rnews)
|
||
echo `wc -c < $dfile`\ $arg1 $othersys \($from\)
|
||
echo -n ' '
|
||
grep '^Newsgroups:' $dfile
|
||
echo -n ' '
|
||
grep '^Subject:' $dfile
|
||
;;
|
||
*)
|
||
echo `wc -c < $dfile`\ $arg1 $arg2 $extra [$othersys $dfile] \($from\)
|
||
;;
|
||
esac
|
||
;;
|
||
*)
|
||
echo Unknown xcmd in $xfile: $xcmd $arg1 $arg2
|
||
exit
|
||
;;
|
||
esac
|
||
done
|
||
}
|
||
}
|
||
done
|
||
|
||
# Check for incoming work
|
||
for cmdfile in X./*
|
||
do
|
||
test -f $cmdfile || continue
|
||
othersys=`expr $cmdfile : 'X./X.\(.*\).....'`
|
||
comment=
|
||
cat $cmdfile | {
|
||
while read cmd arg1 arg2 extra
|
||
do
|
||
case $cmd in
|
||
U)
|
||
from=$arg2!$arg1
|
||
;;
|
||
Z)
|
||
;;
|
||
I)
|
||
;;
|
||
F)
|
||
if test -f D./$arg1
|
||
then
|
||
dfile=D./$arg1
|
||
elif test -f XTMP/$arg2
|
||
then
|
||
dfile=XTMP/$arg2
|
||
comment="(EXECUTING)"
|
||
else
|
||
continue 2
|
||
fi
|
||
;;
|
||
C)
|
||
xcmd=$arg1
|
||
xargs="$arg2 $extra"
|
||
case $arg1 in
|
||
rmail)
|
||
from=$othersys!`head -1 $dfile | ( read arg1 arg2 extra; echo $arg2 )`
|
||
echo -n ' '
|
||
grep '^Subject:' $dfile || echo ''
|
||
;;
|
||
esac
|
||
;;
|
||
*) echo Bad cmd in $cmdfile: $cmd $arg1 $arg2 $extra
|
||
continue ;;
|
||
esac
|
||
done
|
||
echo `wc -c < $dfile`\ $xcmd $xargs $comment \($from\)
|
||
}
|
||
done
|
||
!Funky!Stuff!
|
||
|
||
|
||
|
||
From: Nancy Blachman <decvax!decwrl!sun!idi!resonex!nancy@Ucb-Vax.ARPA>
|
||
To: net.unix, net.unix-wizards, net.sources
|
||
Subject: Actual tricks, shells, csh aliases and the like, 3 of 3
|
||
Date: 16 Oct 84 21:24:32 GMT
|
||
Organization: Resonex Inc., Sunnyvale, CA
|
||
|
||
> [Know anybody with a GREAT .login or .cshrc?]
|
||
|
||
> I'm interested in collecting the little tricks, shell scripts, awk
|
||
> hacks, csh aliases, and such that people have built to make their daily
|
||
> life a little easier or more automatic. Being a fairly new system
|
||
> administrator I don't have the big toolbox that years of messing around
|
||
> will leave you with. If you have any hacks you're proud of (or that
|
||
> you aren't proud of, but which work anyway), and you're willing to make
|
||
> them public, mail them to me. I'll collect, collate, shuffle, sort,
|
||
> munge, judge, select and discard them and then "summarize to the net".
|
||
|
||
This article centers on C programs and awk scripts I received in response to
|
||
my solicitation. The first article concentrates on aliases, and .cshrc and
|
||
.login files. The second article in this series focuses shell scripts.
|
||
|
||
/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/
|
||
> Nancy Blachman {allegra,hplabs,ihnp4,sun}!resonex!nancy (408)720 8600 x37 <
|
||
/\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\//\/
|
||
|
||
::::::::::::::
|
||
programs/1
|
||
::::::::::::::
|
||
Date: Sat, 15 Sep 84 02:45:08 pdt
|
||
From: <hplabs!intelca!t4test!chip>
|
||
To: intelca!hplabs!resonex!nancy
|
||
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like
|
||
|
||
One thing I've put together is a bunch of scripts which give you a
|
||
status line on a DEC type terminal. The thing is hardwired into VTxxx
|
||
type stuff rather than termcap for two reasons. First, the cursor
|
||
save/restore function isn't part of termcap. Secondly, the set
|
||
scrolling region is part of termcap, but it is for VT100 type
|
||
terminals. Since we only have DEC terminals, it doesn't hurt us too
|
||
much.
|
||
|
||
Some history: I used to like to display my current working directory
|
||
on my prompt line. Later I wanted my terminal line there too. (That
|
||
was in case a terminal I was on locked up, I could quickly tell what
|
||
terminal to kill.) Later, when I had four accounts on the machine I
|
||
thought it would be nice to display my login name in my prompt. The
|
||
straw which broke the camel's back was that we bought another VAX, and
|
||
I wanted to be able to see which machine I was logged on. As you might
|
||
imagine, my prompt now extended about 60 columns across the screen. My
|
||
answer was to take everything out of my prompt except the history
|
||
number and stick it at a status line at the bottom of my screen.
|
||
|
||
Below is a shar archive of the status line files. You do a `source
|
||
stat.init' to get stuff initialized. Then `son' and `soff' (which are
|
||
aliased to source the two other scripts) turn the status line on and
|
||
off. These also define a bunch of aliases which help you work with
|
||
programs which don't like the status line. So, I put a `source
|
||
/usr/public/stat.init' followed by a `son' in my `.login'. (I don't
|
||
turn it on with my `.cshrc', my shell escapes would then get awfully
|
||
sloooooow.)
|
||
|
||
Also, you would need to add `vt100s' and `vt131s' to /etc/termcap.
|
||
This is to keep screen stuff (e.g. more, vi, etc.) happy if you run
|
||
them with the status line on. This is what I use:
|
||
|
||
################ VT131 with 24th line reserved
|
||
################ d13s|vt131s|VT131S|vt-131s|pt131s|pt-131s|dec
|
||
vt131s:\
|
||
:li#23:tc=vt131
|
||
|
||
You will definately want to change the terminal identification stuff in
|
||
`stat.init'. We run Eunice, so I use the `grep' to convert the Unix
|
||
style terminal line identification to a VMS terminal port.
|
||
|
||
You can redefine `statin' in the `stat.init' script to put whatever you
|
||
want on the status line.
|
||
|
||
Well...after all this, I hope you use VT1xx/VT2xx terminals.
|
||
Otherwise, this won't be real exciting. (Unless you want to rewrite
|
||
`statterm.c')
|
||
|
||
---
|
||
|
||
Chip Rosenthal, Intel/Santa Clara
|
||
{ idi|intelca|icalqa|kremvax|qubix|ucscc } ! t4test ! { chip|news }
|
||
|
||
----- cut here -----------------------------------------------------------
|
||
|
||
: This is a shar archive. Extract with sh, not csh.
|
||
: This archive contains the following files
|
||
: Makefile stat.init stat.on stat.off statterm.c
|
||
: Total number of files: 5
|
||
echo x - Makefile [file 1 of 5]
|
||
sed 's/^|//' > Makefile << '!-FUNKY-STUFF-!'
|
||
|BIN= /usr/public
|
||
|OBJS= statterm
|
||
|
|
||
|IOBJS= $(BIN)/statterm \
|
||
| $(BIN)/stat.init \
|
||
| $(BIN)/stat.on \
|
||
| $(BIN)/stat.off
|
||
|
|
||
|SOURCES=Makefile \
|
||
| stat.init \
|
||
| stat.on \
|
||
| stat.off \
|
||
| statterm.c
|
||
|
|
||
|all: $(OBJS)
|
||
|install: $(IOBJS)
|
||
|shar: stat.shar
|
||
|
|
||
|statterm: statterm.c
|
||
| cc -O statterm.c -o statterm
|
||
|
|
||
|$(BIN)/statterm: statterm
|
||
| cp $? $@
|
||
| chmod 755 $@
|
||
|
|
||
|$(BIN)/stat.init: stat.init
|
||
| cp $? $@
|
||
| chmod 755 $@
|
||
|
|
||
|$(BIN)/stat.on: stat.on
|
||
| cp $? $@
|
||
| chmod 755 $@
|
||
|
|
||
|$(BIN)/stat.off: stat.off
|
||
| cp $? $@
|
||
| chmod 755 $@
|
||
|
|
||
|stat.shar: $(SOURCES)
|
||
| shar $(SOURCES) > $@
|
||
|
|
||
|
|
||
!-FUNKY-STUFF-!
|
||
echo x - stat.init [file 2 of 5]
|
||
sed 's/^|//' > stat.init << '!-FUNKY-STUFF-!'
|
||
|alias a 'alias'
|
||
|
|
||
|# run statterm to verify terminal can do status line
|
||
|statterm
|
||
|if $status then
|
||
| # status line not available on this terminal -- see if a
|
||
| # baseterm is defined. if so, then maybe $TERM is just
|
||
| # messed up from earlier invocation of stat.init.
|
||
| if $?baseterm then
|
||
| # baseterm has been defined -- see if it will work
|
||
| set temp=$TERM
|
||
| setenv TERM $baseterm
|
||
| statterm
|
||
| if $status then
|
||
| # nope -- baseterm will not work either
|
||
| setenv TERM $temp
|
||
| unset temp
|
||
| goto failed
|
||
| else
|
||
| # yes -- baseterm will work
|
||
| echo "changing terminal type from $temp to $TERM"
|
||
| unset temp
|
||
| endif
|
||
| else
|
||
| # no baseterm defined
|
||
| goto failed
|
||
| endif
|
||
|endif
|
||
|
|
||
|# status line will work with this terminal
|
||
|set baseterm=$TERM
|
||
|set ignoreeof
|
||
|
|
||
|# find user's system (ick)
|
||
|set system=`tr '[A-Z]' '[a-z]' < /usr/include/whoami`
|
||
|
|
||
|# find user's tty (ick ick ick)
|
||
|set temp=`tty`'$'
|
||
|set tty=`grep "$temp" /etc/dev.com | sed -e 's/^.*_\(.*\):.*/\1/'`
|
||
|unset temp
|
||
|
|
||
|# setup terminal strings
|
||
|set statin="`statterm in '${system}\\!${user}' '(${tty})'`"
|
||
|set statout="`statterm out`"
|
||
|set statoff="`statterm off`"
|
||
|echo -n "$statoff"
|
||
|
|
||
|# setup status commands
|
||
|# son - turn on status mode
|
||
|# soff - turn off status mode
|
||
|# stat - draw status line
|
||
|# nostat - erase status line
|
||
|# termstat - setenv the terminal with status line protected
|
||
|# termnorm - setenv the terminal without a status line
|
||
|# ns - execute a command without a status line
|
||
|a son 'source /usr/public/stat.on'
|
||
|a soff 'source /usr/public/stat.off'
|
||
|a stat ';'
|
||
|a nostat ';'
|
||
|a termstat ';'
|
||
|a termnorm ';'
|
||
|a ns 'nostat ; termnorm ; \!* ; termstat ; stat ; echo ""'
|
||
|
|
||
|# alias the commands which maintain the status line
|
||
|a cd 'chdir \!* ; stat'
|
||
|a popd 'popd ; stat'
|
||
|a pushd 'pushd \!* ; stat'
|
||
|
|
||
|# alias the commands which (might) munch the status line
|
||
|a clear 'clear \!* ; stat'
|
||
|a mail 'mail \!* ; stat'
|
||
|a more 'more \!* ; stat'
|
||
|
|
||
|# alias the commands which should be done with the status line off
|
||
|a lo 'ns logout \!*'
|
||
|a LO 'ns logout \!*'
|
||
|a rn 'ns /local/bin/rn \!*'
|
||
|a pn 'ns /local/bin/pn \!*'
|
||
|a reply 'ns /local/bin/reply \!*'
|
||
|a sus 'ns suspend \!*'
|
||
|a vi 'ns /usr/ucb/vi \!*'
|
||
|a view 'ns /usr/ucb/view \!*'
|
||
|
|
||
|# that is all folks. the status stuff is initialized
|
||
|# now all you need is a 'son' to turn it on
|
||
|exit 0
|
||
|
|
||
|failed:
|
||
|set baseterm=$TERM
|
||
|set temp="status line is not available for terminal type $TERM"
|
||
|echo $temp
|
||
|set statin=";"
|
||
|set statout=";"
|
||
|if $?statoff == 0 then
|
||
| set statoff=";"
|
||
|endif
|
||
|alias son echo "$temp"
|
||
|alias off 'source /usr/public/stat.off'
|
||
|unset temp
|
||
|soff
|
||
|exit 1
|
||
|
|
||
!-FUNKY-STUFF-!
|
||
echo x - stat.on [file 3 of 5]
|
||
sed 's/^|//' > stat.on << '!-FUNKY-STUFF-!'
|
||
|a stat 'echo -n "${statin}${cwd}${statout}"'
|
||
|a nostat 'echo -n "$statoff"'
|
||
|a termstat 'setenv TERM ${baseterm}s'
|
||
|a termnorm 'setenv TERM $baseterm'
|
||
|termstat
|
||
|stat
|
||
|echo ""
|
||
|set statmode
|
||
!-FUNKY-STUFF-!
|
||
echo x - stat.off [file 4 of 5]
|
||
sed 's/^|//' > stat.off << '!-FUNKY-STUFF-!'
|
||
|setenv TERM $baseterm
|
||
|echo -n "$statoff"
|
||
|unset statmode
|
||
|a termstat ';'
|
||
|a termnorm ';'
|
||
|a stat ';'
|
||
|a nostat ';'
|
||
!-FUNKY-STUFF-!
|
||
echo x - statterm.c [file 5 of 5]
|
||
sed 's/^|//' > statterm.c << '!-FUNKY-STUFF-!'
|
||
|/*
|
||
| * FILE: statterm
|
||
| * VERSION: V0.01 [preliminary]
|
||
| * DATE: Mon Aug 27 16:43:13 PDT 1984
|
||
| * AUTHOR: Chip Rosenthal/Intel Corporation
|
||
| * ADDRESS: t4test!chip
|
||
| * PACKAGE: 'stat' terminal status line package
|
||
| * DESCRIPTION: produces terminal escape sequences to implement status line
|
||
| * COMPILATION: cc -C statterm.c -o statterm
|
||
| *
|
||
| * REVISION NOTES:
|
||
| *
|
||
| * V1.00 Original program.
|
||
| *
|
||
| *
|
||
| * USAGE:
|
||
| *
|
||
| * statterm
|
||
| * Verifies that the status line will work with current terminal.
|
||
| * Returns a zero exit status if it will, nonzero if it won't.
|
||
| *
|
||
| * statterm in [arg ...]
|
||
| * Creates a string which opens up the status line. Any
|
||
| * arguments are placed at the beginning of the status
|
||
| * line, and the cursor is left there.
|
||
| *
|
||
| * statterm out
|
||
| * Create string which closes the status line and returns
|
||
| * cursor to position it was in prior to the last execution
|
||
| * of a 'statterm in' string.
|
||
| *
|
||
| * statterm off
|
||
| * Creates a string which removes the status line.
|
||
| *
|
||
| *
|
||
| * EXAMPLE:
|
||
| * # this is a cshell script
|
||
| * statterm
|
||
| * if $status then
|
||
| * echo "status line will not work on this terminal"
|
||
| * exit
|
||
| * endif
|
||
| * echo -n `statterm in $user`
|
||
| * echo -n `pwd`
|
||
| * echo `statterm out`
|
||
| *
|
||
| *
|
||
| * BUGS:
|
||
| *
|
||
| * This program is hardwired into the DEC VT100 terminal escape sequences.
|
||
| * This is done because (unfortunately) 'termcap' doesn't offer a cursor
|
||
| * position save/restore feature.
|
||
| *
|
||
| */
|
||
|
|
||
|#include <stdio.h>
|
||
|#define strmatch(A,B) (strcmp((A),(B))==0)
|
||
|
|
||
|/*
|
||
| * VT100 Terminal Escape Definitions -- all parameters are strings
|
||
| */
|
||
|#define ESC putchar(27); /* escape character */
|
||
|#define CSI ESC;putchar('['); /* command string */
|
||
|#define DECSC ESC;putchar('7'); /* save cursor position */
|
||
|#define DECRC ESC;putchar('8'); /* restore cursor position */
|
||
|#define CUP(L,C) CSI;printf("%s;%sH",L,C); /* set cursor to line/col */
|
||
|#define CUU1 CSI;printf("1A"); /* cursor up one line */
|
||
|#define CUD1 CSI;printf("1B"); /* cursor down one line */
|
||
|#define EL(MODE) CSI;printf("%sK",MODE); /* erase line */
|
||
|#define ED(MODE) CSI;printf("%sJ",MODE); /* erase display */
|
||
|#define DECSETBM(T,B) CSI;printf("%s;%sr",T,B); /* top/bot of scroll area */
|
||
|/*
|
||
| * erasing modes:
|
||
| * mode "0" - from cursor to end
|
||
| * mode "1" - from beginning to cursor
|
||
| * mode "2" - entire
|
||
| */
|
||
|
|
||
|
|
||
|main(argc,argv)
|
||
|int argc;
|
||
|char *argv[];
|
||
|{
|
||
| char *term, *getenv();
|
||
| int i;
|
||
|
|
||
| if ( argc == 1 ) {
|
||
| term=getenv("TERM");
|
||
| if ( term == NULL )
|
||
| exit(1);
|
||
| if ( strmatch(term,"vt100") || strmatch(term,"vt131") )
|
||
| exit(0);
|
||
| else
|
||
| exit(1);
|
||
| }
|
||
|
|
||
| if ( strmatch(argv[1],"in") ) {
|
||
| /*
|
||
| * Save cursor position, go to line 24, print out the arguments, and
|
||
| * erase the rest of the status line. Cursor remains in status line.
|
||
| */
|
||
| DECSC;
|
||
| CUP("24","1");
|
||
| for ( i=2 ; i<argc ; ++i )
|
||
| printf("%s ",argv[i]);
|
||
| EL("0");
|
||
| } else if ( strmatch(argv[1],"out") ) {
|
||
| /*
|
||
| * Protect status line from scrolling and restore cursor to location
|
||
| * prior to the last 'in' call. Move the cursor up and down one line.
|
||
| * This will keep it out of the status line area if it was there when
|
||
| * 'in' was called.
|
||
| */
|
||
| DECSETBM("1","23");
|
||
| DECRC;
|
||
| CUU1;
|
||
| CUD1;
|
||
| } else if ( strmatch(argv[1],"off") ) {
|
||
| /*
|
||
| * Save the current cursor position, unprotect the status line, erase
|
||
| * the status line, and restore the cursor position.
|
||
| */
|
||
| DECSC;
|
||
| DECSETBM("1","24");
|
||
| CUP("24","1");
|
||
| EL("2");
|
||
| DECRC;
|
||
| } else
|
||
| exit(1);
|
||
|
|
||
|}
|
||
!-FUNKY-STUFF-!
|
||
exit
|
||
|
||
|
||
|
||
::::::::::::::
|
||
programs/2
|
||
::::::::::::::
|
||
From: ihnp4!mcnc!malloy@ittral
|
||
Date: Thu, 13 Sep 84 21:35:18 edt
|
||
To: ihnp4!resonex!nancy@mcnc
|
||
Subject: Tricks
|
||
|
||
Well it depends upon what you mean. The big problem with having lots of aliases
|
||
and such is they start taking up large amounts of memory. Take it from someone
|
||
who knows. But here's a few things. Some you no doubt already have, and most
|
||
are trivial, but it's better to be complete then to leave anything out. You
|
||
can always just delete this. == William P. Malloy (ittral!malloy}
|
||
---------------------------------------------------------------------
|
||
In a .cshrc, a warning and a work around. Apparently not known by most people
|
||
but obvious to people have who been around. Our users keep bumping into it
|
||
about once a year like clock work.
|
||
# reason for setting variables only if a prompt already exists
|
||
# If it sets prompt in a non-interactive shell, for instance vi(1)
|
||
# firing up a sub-shell to expand shell meta-characters, the set prompt
|
||
# will stomp on alot of shell variables used for the expansion (like ~)
|
||
#
|
||
if ( $?prompt ) then
|
||
set mail=/usr/spool/mail/malloy
|
||
set prompt=\`
|
||
set histchars=",;"
|
||
endif
|
||
Note the setting of histchars. A little known, but for me much loved feature
|
||
of csh is the ability to change the history characters "!^" from their default
|
||
values. The pair `,;' are easier to reach, don't require shifting, and don't
|
||
appear in mail paths. Typing `mail mcnc\!ihnp4\!resonex\!nancy' gets to be
|
||
a pain every time you want to mail someone.
|
||
|
||
alias , 'redo \,* ~/.cmd ~/.cmd1 ; source ~/.cmd1 '
|
||
|
||
This little alias allows you to have command editing in the csh. It's quite
|
||
useful, particularly when you've got a LONG painful command line. The , is
|
||
just the history character and is ! for most people. The command redo is a
|
||
simple C program.
|
||
--------------- redo.c -------------------
|
||
#include <stdio.h>
|
||
|
||
/* redo -- outputs a command file (last arg )used to edit and
|
||
re-ex a command. Next to last arg is dest file of the command.
|
||
|
||
NOTE: if you use a non-standard history character, i.e. not !
|
||
then you must `setenv HISTCHARS $histchars' in your .login
|
||
If you do not `set histchars=",;"' for instance then it will
|
||
automagically default to ! -- 12/2/83 wpm
|
||
|
||
First arg is the history ref . To use:
|
||
alias , 'redo \,* ~/cmd ~/cmd1 ; source ~/cmd1 '
|
||
, 25 to edit & re-execute ,25
|
||
, , or , to edit & re-execute ,,
|
||
, v to edit & re-execute ,v ,etc.
|
||
|
||
*/
|
||
|
||
main(argc, argv)
|
||
int argc;
|
||
char *argv[];
|
||
{
|
||
FILE *fp;
|
||
char *t, *getenv();
|
||
|
||
fp = fopen(argv[argc-1], "w");
|
||
if ((t = getenv("HISTCHARS")) != NULL)
|
||
t[1] = '\0';
|
||
else
|
||
t = "!";
|
||
fprintf(fp, "echo \"%s", t);
|
||
if ( (argc < 4) || (strcmp(argv[1], t) == 0) )
|
||
fputs("-2", fp);
|
||
else
|
||
fputs(argv[1], fp);
|
||
fputs(":q\" >! ", fp);
|
||
fputs(argv[argc-2], fp);
|
||
putc('\n', fp);
|
||
fputs("ex +open ", fp);
|
||
fputs(argv[argc-2], fp);
|
||
putc('\n', fp);
|
||
fputs("/usr/local/typein2 < ", fp);
|
||
fputs(argv[argc-2], fp);
|
||
putc('\n', fp);
|
||
fclose(fp);
|
||
exit(0);
|
||
}
|
||
------------------ (end of redo.c, begining of typein2.c) --------------------
|
||
#include <stdio.h>
|
||
#include <sgtty.h>
|
||
|
||
main(argc, argv)
|
||
int argc;
|
||
char **argv;
|
||
{
|
||
register char *cp;
|
||
struct sgttyb stb, stb2;
|
||
int pendin = LPENDIN;
|
||
int c,i,j;
|
||
char buff[2];
|
||
char buff2[256];
|
||
|
||
i=0;
|
||
while ((c=getchar()) != EOF) {
|
||
buff2[i++]=c;
|
||
}
|
||
ioctl(2, TIOCGETP, &stb);
|
||
stb2 = stb;
|
||
stb.sg_flags &= ~ECHO;
|
||
ioctl(2, TIOCSETN, &stb);
|
||
for (j=0; j<i; j++) {
|
||
ioctl(2, TIOCSTI, &buff2[j]);
|
||
putchar(buff2[j]);
|
||
}
|
||
ioctl(2, TIOCSETN, &stb2);
|
||
ioctl(2, TIOCLBIS, &pendin);
|
||
exit(0);
|
||
}
|
||
---------------------------- (end of typein2.c) ------------------------
|
||
A couple of oldies but still the simplest. cd and back aliases.
|
||
alias back 'set back=$old; set old=$cwd; cd $back; unset back; dirs'
|
||
alias cd 'set old=$cwd; chdir \,*; set prompt = "< $cwd:t > "'
|
||
|
||
# this is a useful feature for vi
|
||
setenv EXINIT 'map #1 Gi/\<A\>"add@a|map #2 1G\!Gvispell|set ai sw=3'
|
||
|
||
You f2 key will run a file through the spell program, and put the words it
|
||
doesn't find in the dictionary at the bottom of the file. Then typing f1 will
|
||
cause it to delete the last line in the file, and search for the string in
|
||
the rest of the file.
|
||
------------------------------ (source for vispell) -------------
|
||
#! /bin/sh
|
||
#
|
||
tee /tmp/vis$$
|
||
echo SpellingList
|
||
spell /tmp/vis$$
|
||
rm /tmp/vis$$
|
||
------------------------------- (end of vispell) ------------------
|
||
Stuff from our /.cshrc file. psa lets you see what's going on in the system
|
||
and what people are doing. Useful to see if people are hanging themselves.
|
||
alias psa 'ps axu | sed "/getty/d" | sort -f | more'
|
||
|
||
A simple alias to compile C programs (C adm.c expands to cc adm.c -o adm).
|
||
alias C 'cc \,:* -o \,^:r'
|
||
|
||
Useful to see what's going on in the system without those !@#$% bells.
|
||
alias moremsgs "tr -d '\07' </usr/adm/messages | more"
|
||
|
||
Like fg.
|
||
alias pj '%-'
|
||
|
||
A feature we use in our root .cshrc allowing indivual superusers to get their
|
||
own enviornment. Useful if people want their own enviornment anywhere people
|
||
share an account.
|
||
if ( $user == "malloy" ) then
|
||
source /t/malloy/.root
|
||
endif
|
||
|
||
--------------- (here's some things I picked up off the net) --------------
|
||
From: ittvax!decvax!harpo!utah-cs!seismo!hao!denelcor!udenva!koala!aburt
|
||
Date: Fri Aug 10 09:19:37 1984
|
||
Subject: Perversions of source -h and other csh aliases
|
||
Newsgroups: net.unix,net.unix-wizards,net.sources
|
||
|
||
For your enjoyment, here are some interesting lunch hour csh aliases that
|
||
I've created.
|
||
{this is to slow, my version is a little faster}
|
||
My personal favorite is the "history editor" -- allows you to edit
|
||
you csh history. The alias:
|
||
|
||
alias hed history -h !* > $hed; vi + $hed; source -h $hed
|
||
|
||
will allow you to invoke 'vi' on your current history. (If, for
|
||
instance, you typed in a long, tedious line and put in an extra space,
|
||
among other things. The ^...^... mechanism to remove it can be quite
|
||
tedious; 'hed's is easy.) Before anyone starts flaming that vi is too
|
||
slow, history can do it (even if it's tough to type and you're prone to
|
||
more typos doing the history), etc. -- if you don't like it, don't use it.
|
||
|
||
Hed works particularly well if you move the command in question to the
|
||
end of the file; then '!!' will execute it after you ZZ from vi. The
|
||
only drawback to this is that it trashes your current event numbers
|
||
(they get incremented during the source -h). By using 'hed 10' you
|
||
only edit the last 10 entries in your history. A temp file, which I
|
||
keep in $hed (set to /tmp/hed.$$ from my .login), is used each time for
|
||
the history. Obvious changes to this are to use /tmp/hed.$$ straight
|
||
out and add "rm /tmp/hed.$$" to the end of the list. If you don't like
|
||
waiting for the rm, and your /tmp doesn't get cleared out periodically,
|
||
put a # in front of the name to make it a disposable file.
|
||
|
||
This may be slower than the vi/emacs mode in the ksh I keep hearing about, but
|
||
it does give the functionality.
|
||
|
||
A slight modification to 'hed'...
|
||
|
||
alias hedf history -h !-0:1 > !-0:2; vi + !-0:2; source -h !-0:2
|
||
|
||
allows you to specify a file to place the history into instead of a temp
|
||
file.
|
||
|
||
Another modification yields:
|
||
|
||
alias heh echo \!* > $hed; vi + $hed; source -h $hed
|
||
|
||
Which lets you edit then add to your history a specific history sequence.
|
||
'Heh' for History edit history.
|
||
|
||
By inserting a 'source \!-0:2' before the source -h in any of the
|
||
above has the effect of executing the commands AND placing them on the
|
||
history list (from which we may conclude that 'alias so source \!* ;
|
||
source -h \!*' is a useful item: it sources a file then places each line
|
||
into your history).
|
||
|
||
On rare occasions you'll have to put extra quotes/escapes around things
|
||
when editing the temp file so it gets sourced right. Particularly around
|
||
aliases with raw history substitutions in them (the \!* type of thing).
|
||
The easiest is to try it first; if it fails, edit it again. After all,
|
||
two 'hed's are better than one...
|
||
|
||
Regarding the use of !-0:1 instead of !:1 for the first argument to the
|
||
current command -- At least one csh is known to accept the former but not
|
||
the latter. (The same csh dumps core (therefore logging you out) on receipt
|
||
of the !# history selector. This is version 1.0 of 4.2BSD csh on a Sun-2.
|
||
The 1.1 csh exhibits this behavior:
|
||
|
||
echo a !#
|
||
a echo a echo
|
||
|
||
adding an extra arg 0 to the end. Is this common to other cshs out there?)
|
||
|
||
So, for those whose csh's allow !:1, use that where I have !-0:1, etc.
|
||
|
||
Another interesting perversion is an alias'd whereis:
|
||
|
||
alias wheres ls -l \{'`echo $path | sed "s/ /,/g"`'\}/'`echo \!-0:1 | sed "s/^./[&]/"`'
|
||
|
||
It does an ls -l on every file (passed as arg 1) in any directory on
|
||
your current path. (No aliases, though adding an if at the front
|
||
should do the trick.) The idea is to turn your $path list into a comma
|
||
separates list, stick that between {}, and append / and arg 1 to that.
|
||
Alas, if the file doesn't exist in one of the directories, you get
|
||
errors from ls saying it doesn't exist in a given directory. So, arg 1
|
||
is turned into a pattern, which is allowed to fail; the pattern is,
|
||
e.g., foo --> [f]oo. So the second arg to ls only expands to the
|
||
existing files.
|
||
---------------------------- (end of net article) ------------------------
|
||
--
|
||
Address: William P. Malloy, ITT Telecom, B & CC Engineering Group, Raleigh NC
|
||
{ihnp4!mcnc, burl, ncsu, decvax!ittvax}!ittral!malloy
|
||
|
||
|
||
::::::::::::::
|
||
awk/1
|
||
::::::::::::::
|
||
Date: Wed, 19 Sep 84 11:44:38 CST
|
||
From: David Chase <hplabs!ucbvax!rbbb@rice.ARPA>
|
||
Subject: Re: Tricks, shell and awk scripts, csh aliases and the like
|
||
To: resonex!nancy@BERKELEY
|
||
|
||
Here is my favorite awk script. It turns a list of csrc's from memory
|
||
errors on an 11/780 (with MS780C controller) into board and chip position
|
||
for certain Mostek memory boards. This script saved me many headaches,
|
||
because the tables in the appendix of the technical manual were hard to read
|
||
and contained errors (errors that were noticed as deviations from a pattern
|
||
when entering this script).
|
||
|
||
#
|
||
# Incredible sleazy awk file to attack memory errors
|
||
# Included here is the local configuration, because some decoding
|
||
# is board specific
|
||
#
|
||
BEGIN {
|
||
# Boards understood by this program
|
||
|
||
# mk4118 = mostek mk8016 fully populated with mk4116 chips (512k)
|
||
known["mk4118"] = 1
|
||
|
||
# mk4116 = mostek mk8016 half populated with mk4116 chips (256k)
|
||
known["mk4116"] = 1
|
||
|
||
# mk8016 = mostek mk8016 fully populated with mk4108 chips (256k)
|
||
known["mk4108"] = 1
|
||
|
||
# m8210 = DEC 256k board; don't know how to decode this guy (256k)
|
||
known["m8210"] = 0
|
||
|
||
# To add different boards, (i.e., not conforming to this system)
|
||
# append to the "pos" map, and make "keys[<array><bank><new board>]"
|
||
# reference the appended chip addresses.
|
||
|
||
# Local configuration
|
||
# boards is indexed by slot number
|
||
boards["0"] = "m8210"
|
||
boards["1"] = "m8210"
|
||
boards["2"] = "m8210"
|
||
boards["3"] = "m8210"
|
||
boards["4"] = "m8210"
|
||
boards["5"] = "m8210"
|
||
boards["6"] = "mk4116"
|
||
boards["7"] = "mk4116"
|
||
boards["8"] = "mk4116"
|
||
boards["9"] = "mk4116"
|
||
boards["a"] = "mk4116"
|
||
boards["b"] = "mk4116"
|
||
boards["c"] = "mk4118"
|
||
boards["d"] = "mk4118"
|
||
boards["e"] = "mk4118"
|
||
boards["f"] = "mk4118"
|
||
|
||
# bit in error for a given CRC calculation
|
||
# bits are identified by "u" (upper), "l" (lower), and "c" (check)
|
||
# folowed by the bit number.
|
||
|
||
bit["01"] = "c0"
|
||
bit["02"] = "c1"
|
||
bit["04"] = "c2"
|
||
bit["08"] = "c3"
|
||
bit["10"] = "c4"
|
||
bit["19"] = "l01"
|
||
bit["1a"] = "l02"
|
||
bit["1c"] = "l04"
|
||
bit["1f"] = "l07"
|
||
bit["20"] = "c5"
|
||
bit["38"] = "l00"
|
||
bit["3b"] = "l03"
|
||
bit["3d"] = "l05"
|
||
bit["3e"] = "l06"
|
||
bit["40"] = "c6"
|
||
bit["49"] = "l09"
|
||
bit["4a"] = "l10"
|
||
bit["4c"] = "l12"
|
||
bit["4f"] = "l15"
|
||
bit["51"] = "l17"
|
||
bit["52"] = "l18"
|
||
bit["54"] = "l20"
|
||
bit["57"] = "l23"
|
||
bit["58"] = "l24"
|
||
bit["5b"] = "l27"
|
||
bit["5d"] = "l29"
|
||
bit["5e"] = "l30"
|
||
bit["68"] = "l08"
|
||
bit["6b"] = "l11"
|
||
bit["6d"] = "l13"
|
||
bit["6e"] = "l14"
|
||
bit["70"] = "l16"
|
||
bit["73"] = "l19"
|
||
bit["75"] = "l21"
|
||
bit["76"] = "l22"
|
||
bit["79"] = "l25"
|
||
bit["7a"] = "l26"
|
||
bit["7c"] = "l28"
|
||
bit["7e"] = "l31"
|
||
bit["80"] = "c7"
|
||
bit["89"] = "u01"
|
||
bit["8a"] = "u02"
|
||
bit["8c"] = "u04"
|
||
bit["8f"] = "u07"
|
||
bit["91"] = "u09"
|
||
bit["92"] = "u10"
|
||
bit["94"] = "u12"
|
||
bit["97"] = "u15"
|
||
bit["98"] = "u16"
|
||
bit["9b"] = "u19"
|
||
bit["9d"] = "u21"
|
||
bit["9e"] = "u22"
|
||
bit["a8"] = "u00"
|
||
bit["ab"] = "u03"
|
||
bit["ad"] = "u05"
|
||
bit["ae"] = "u06"
|
||
bit["b0"] = "u08"
|
||
bit["b3"] = "u11"
|
||
bit["b5"] = "u13"
|
||
bit["b6"] = "u14"
|
||
bit["b9"] = "u17"
|
||
bit["ba"] = "u18"
|
||
bit["bc"] = "u20"
|
||
bit["bf"] = "u23"
|
||
bit["c1"] = "u25"
|
||
bit["c2"] = "u26"
|
||
bit["c4"] = "u28"
|
||
bit["c7"] = "u31"
|
||
bit["e0"] = "u24"
|
||
bit["e3"] = "u27"
|
||
bit["e5"] = "u29"
|
||
bit["e6"] = "u30"
|
||
|
||
# binary decoding of hex digits
|
||
|
||
hex["0"] = "0000"
|
||
hex["1"] = "0001"
|
||
hex["2"] = "0010"
|
||
hex["3"] = "0011"
|
||
hex["4"] = "0100"
|
||
hex["5"] = "0101"
|
||
hex["6"] = "0110"
|
||
hex["7"] = "0111"
|
||
hex["8"] = "1000"
|
||
hex["9"] = "1001"
|
||
hex["a"] = "1010"
|
||
hex["b"] = "1011"
|
||
hex["c"] = "1100"
|
||
hex["d"] = "1101"
|
||
hex["e"] = "1110"
|
||
hex["f"] = "1111"
|
||
|
||
# chip positions for a given bit, collected across all possible
|
||
# boards. Each group of 3 letters represents a position.
|
||
# See keys for a better description.
|
||
|
||
pos["u31"] = "i01h01g01f01"
|
||
pos["u30"] = "e01d01c01b01"
|
||
pos["u29"] = "i02h02g02f02"
|
||
pos["u28"] = "e02d02c02b02"
|
||
pos["u27"] = "i03h03g03f03"
|
||
pos["u26"] = "e03d03c03b03"
|
||
pos["u25"] = "i04h04g04f04"
|
||
pos["u24"] = "e04d04c04b04"
|
||
pos["u23"] = "a01a02a03a04"
|
||
pos["u22"] = "i05h05g05f05"
|
||
pos["u21"] = "e05d05c05b05"
|
||
pos["u20"] = "i06h06g06f06"
|
||
pos["u19"] = "e06d06c06b06"
|
||
pos["u18"] = "i07h07g07f07"
|
||
pos["u17"] = "e07d07c07b07"
|
||
pos["u16"] = "i08h08g08f08"
|
||
pos["u15"] = "e08d08c08b08"
|
||
pos["u14"] = "a05a06a07a08"
|
||
pos["u13"] = "i09h09g09f09"
|
||
pos["u12"] = "e09d09c09b09"
|
||
pos["u11"] = "i10h10g10f10"
|
||
pos["u10"] = "e10d10c10b10"
|
||
pos["u09"] = "i11h11g11f11"
|
||
pos["u08"] = "e11d11c11b11"
|
||
pos["u07"] = "i12h12g12f12"
|
||
pos["u06"] = "e12d12c12b12"
|
||
pos["u05"] = "a09a10a11a12"
|
||
pos["u04"] = "i13h13g13f13"
|
||
pos["u03"] = "e13d13c13b13"
|
||
pos["u02"] = "i14h14g14f14"
|
||
pos["u01"] = "e14d14c14b14"
|
||
pos["u00"] = "i15h15g15f15"
|
||
pos["c7"] = "e15d15c15b15"
|
||
pos["c6"] = "i16h16g16f16"
|
||
pos["c5"] = "e16d16c16b16"
|
||
pos["c4"] = "a13a14a15a16"
|
||
pos["l31"] = "i17h17g17f17"
|
||
pos["l30"] = "e17d17c17b17"
|
||
pos["l29"] = "i18h18g18f18"
|
||
pos["l28"] = "e18d18c18b18"
|
||
pos["l27"] = "i19h19g19f19"
|
||
pos["l26"] = "e19d19c19b19"
|
||
pos["l25"] = "i20h20g20f20"
|
||
pos["l24"] = "e20d20c20b20"
|
||
pos["l23"] = "a17a18a19a20"
|
||
pos["l22"] = "i21h21g21f21"
|
||
pos["l21"] = "e21d21c21b21"
|
||
pos["l20"] = "i22h22g22f22"
|
||
pos["l19"] = "e22d22c22b22"
|
||
pos["l18"] = "i23h23g23f23"
|
||
pos["l17"] = "e23d23c23b23"
|
||
pos["l16"] = "i24h24g24f24"
|
||
pos["l15"] = "e24d24c24b24"
|
||
pos["l14"] = "a21a22a23a24"
|
||
pos["l13"] = "i25h25g25f25"
|
||
pos["l12"] = "e25d25c25b25"
|
||
pos["l11"] = "i26h26g26f26"
|
||
pos["l10"] = "e26d26c26b26"
|
||
pos["l09"] = "i27h27g27f27"
|
||
pos["l08"] = "e27d27c27b27"
|
||
pos["l07"] = "i28h28g28f28"
|
||
pos["l06"] = "e28d28c28b28"
|
||
pos["l05"] = "a25a26a27a28"
|
||
pos["l04"] = "i29h29g29f29"
|
||
pos["l03"] = "e29d29c29b29"
|
||
pos["l02"] = "i30h30g30f30"
|
||
pos["l01"] = "e30d30c30b30"
|
||
pos["l00"] = "i31h31g31f31"
|
||
pos["c3"] = "e31d31c31b31"
|
||
pos["c2"] = "i32h32g32f32"
|
||
pos["c1"] = "e32d32c32b32"
|
||
pos["c0"] = "a29a30a31a32"
|
||
|
||
# keys is indexed by <board #> <bank> <board type>
|
||
# and yields an index into a particular pos string
|
||
# for example, board 0, bit 0 on an mk4118 board
|
||
# gives a key of 4. If the bit in error was c0, then
|
||
# the chip in error is a32 (from the 4th group of 3
|
||
# in pos["c0"]. To change this map, create new keys
|
||
# and (if necessary) append to the pos entries.
|
||
# If it could be more than one chip, then use a multiple
|
||
# digit key (e.g, see the keys for the mk4108 board).
|
||
|
||
keys["00mk4118"] = "4"
|
||
keys["20mk4118"] = "4"
|
||
keys["40mk4118"] = "4"
|
||
keys["60mk4118"] = "4"
|
||
keys["80mk4118"] = "4"
|
||
keys["a0mk4118"] = "4"
|
||
keys["c0mk4118"] = "4"
|
||
keys["e0mk4118"] = "4"
|
||
keys["01mk4118"] = "2"
|
||
keys["21mk4118"] = "2"
|
||
keys["41mk4118"] = "2"
|
||
keys["61mk4118"] = "2"
|
||
keys["81mk4118"] = "2"
|
||
keys["a1mk4118"] = "2"
|
||
keys["c1mk4118"] = "2"
|
||
keys["e1mk4118"] = "2"
|
||
keys["10mk4118"] = "3"
|
||
keys["30mk4118"] = "3"
|
||
keys["50mk4118"] = "3"
|
||
keys["70mk4118"] = "3"
|
||
keys["90mk4118"] = "3"
|
||
keys["b0mk4118"] = "3"
|
||
keys["d0mk4118"] = "3"
|
||
keys["f0mk4118"] = "3"
|
||
keys["11mk4118"] = "1"
|
||
keys["31mk4118"] = "1"
|
||
keys["51mk4118"] = "1"
|
||
keys["71mk4118"] = "1"
|
||
keys["91mk4118"] = "1"
|
||
keys["b1mk4118"] = "1"
|
||
keys["d1mk4118"] = "1"
|
||
keys["f1mk4118"] = "1"
|
||
|
||
keys["00mk4116"] = "4"
|
||
keys["20mk4116"] = "4"
|
||
keys["40mk4116"] = "4"
|
||
keys["60mk4116"] = "4"
|
||
keys["80mk4116"] = "4"
|
||
keys["a0mk4116"] = "4"
|
||
keys["c0mk4116"] = "4"
|
||
keys["e0mk4116"] = "4"
|
||
keys["01mk4116"] = "2"
|
||
keys["21mk4116"] = "2"
|
||
keys["41mk4116"] = "2"
|
||
keys["61mk4116"] = "2"
|
||
keys["81mk4116"] = "2"
|
||
keys["a1mk4116"] = "2"
|
||
keys["c1mk4116"] = "2"
|
||
keys["e1mk4116"] = "2"
|
||
keys["10mk4116"] = "4"
|
||
keys["30mk4116"] = "4"
|
||
keys["50mk4116"] = "4"
|
||
keys["70mk4116"] = "4"
|
||
keys["90mk4116"] = "4"
|
||
keys["b0mk4116"] = "4"
|
||
keys["d0mk4116"] = "4"
|
||
keys["f0mk4116"] = "4"
|
||
keys["11mk4116"] = "2"
|
||
keys["31mk4116"] = "2"
|
||
keys["51mk4116"] = "2"
|
||
keys["71mk4116"] = "2"
|
||
keys["91mk4116"] = "2"
|
||
keys["b1mk4116"] = "2"
|
||
keys["d1mk4116"] = "2"
|
||
keys["f1mk4116"] = "2"
|
||
|
||
keys["00mk4108"] = "34"
|
||
keys["20mk4108"] = "34"
|
||
keys["40mk4108"] = "34"
|
||
keys["60mk4108"] = "34"
|
||
keys["80mk4108"] = "34"
|
||
keys["a0mk4108"] = "34"
|
||
keys["c0mk4108"] = "34"
|
||
keys["e0mk4108"] = "34"
|
||
keys["01mk4108"] = "12"
|
||
keys["21mk4108"] = "12"
|
||
keys["41mk4108"] = "12"
|
||
keys["61mk4108"] = "12"
|
||
keys["81mk4108"] = "12"
|
||
keys["a1mk4108"] = "12"
|
||
keys["c1mk4108"] = "12"
|
||
keys["e1mk4108"] = "12"
|
||
keys["10mk4108"] = "34"
|
||
keys["30mk4108"] = "34"
|
||
keys["50mk4108"] = "34"
|
||
keys["70mk4108"] = "34"
|
||
keys["90mk4108"] = "34"
|
||
keys["b0mk4108"] = "34"
|
||
keys["d0mk4108"] = "34"
|
||
keys["f0mk4108"] = "34"
|
||
keys["11mk4108"] = "12"
|
||
keys["31mk4108"] = "12"
|
||
keys["51mk4108"] = "12"
|
||
keys["71mk4108"] = "12"
|
||
keys["91mk4108"] = "12"
|
||
keys["b1mk4108"] = "12"
|
||
keys["d1mk4108"] = "12"
|
||
keys["f1mk4108"] = "12"
|
||
}
|
||
|
||
{csrc = $1
|
||
syndrome = substr (csrc,7,2)
|
||
board = substr (csrc,2,1)
|
||
boardtype = boards[board]
|
||
bank = substr (hex [substr (csrc,3,1)],1,1)
|
||
chips = bit[syndrome]
|
||
if (known[boardtype])
|
||
{ where = pos[chips]
|
||
key = keys[board bank boardtype]
|
||
sbegin = 3 * (substr(key,1,1) - 1) + 1
|
||
thechip = substr(where,sbegin,3)
|
||
if (length(key) > 1)
|
||
{ sbegin = 3 * (substr(key,2,1) - 1) + 1
|
||
thechip = thechip " and/or " substr(where,sbegin,3)
|
||
}
|
||
# printf "\n"
|
||
# print "csrc = " csrc
|
||
# print "syndrome = " syndrome
|
||
# print "board = " board
|
||
# print "bank = " bank
|
||
# print "chips = " chips
|
||
# print "locations = " where
|
||
# print "boardtype = " boardtype
|
||
# print "key = " key
|
||
# print "the chip is " thechip
|
||
errors[board "-" thechip]++;
|
||
}
|
||
else
|
||
{
|
||
# printf "\n"
|
||
# print "Board type " boardtype " is unknown"
|
||
errors["unknown-unknown"]++;
|
||
}
|
||
}
|
||
|
||
END { for (i in errors) {
|
||
n = split(i,list,"-");
|
||
printf "%d errors for board %s, chip %s\n",errors[i],list[1],list[2];
|
||
}
|
||
}
|
||
|