[comp.unix.questions] Diffs to the Frequently Asked Questions postings

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (12/02/89)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions postings.

*** /tmp/,RCSt1a08391	Fri Dec  1 15:11:14 1989
--- part1	Fri Dec  1 14:49:59 1989
***************
*** 1,5 ****
--- 1,6 ----
  Subject: Welcome to comp.unix.questions and comp.unix.wizards [Monthly posting]
  
+ [Last changed: $Date: 89/12/01 14:49:54 $ by $Author: sahayman $]
  
  Comp.unix.questions and comp.unix.wizards are two of the most popular
  and highest volume newsgroups on Usenet.  This article is a monthly
*** /tmp/,RCSt1a08405	Fri Dec  1 15:11:17 1989
--- part2	Fri Dec  1 14:50:16 1989
***************
*** 1,5 ****
--- 1,7 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
+ [Last changed: $Date: 89/12/01 14:50:10 $ by $Author: sahayman $]
+ 
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
  ask these questions again, they've been answered plenty of times
***************
*** 19,25 ****
  	How do I check to see if there are characters to be read without
  	    actually reading?
  	How do I find the name of an open file?
! 	How do I rename "*.foo" to "*.bar"?
  	Why do I get [some strange error message] when I "rsh host command" ?
  	How do I find out the creation time of a file?
  	How do I use "rsh" without having the rsh hang around
--- 21,27 ----
  	How do I check to see if there are characters to be read without
  	    actually reading?
  	How do I find the name of an open file?
! 	How do I rename "*.foo" to "*.bar", or change file names to lowercase?
  	Why do I get [some strange error message] when I "rsh host command" ?
  	How do I find out the creation time of a file?
  	How do I use "rsh" without having the rsh hang around
***************
*** 28,36 ****
  	How do I {set an environment variable, change directory} inside a
  	    shell script and have that change affect my current shell?
  	Why doesn't find's "{}" symbol do what I want?
  	What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
  	    stand for?
! 	How do I pronounce "vi"?
  
  
  While these are all legitimate questions, they seem to crop up in
--- 30,41 ----
  	How do I {set an environment variable, change directory} inside a
  	    shell script and have that change affect my current shell?
  	Why doesn't find's "{}" symbol do what I want?
+ 	How do I redirect stdout and stderr separately in csh?
+ 	How do I set the permissions on a symbolic link?
  	What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
  	    stand for?
! 	How do I pronounce "vi" , or "!", or "/*", or ...?
! 
  
  
  While these are all legitimate questions, they seem to crop up in
***************
*** 133,144 ****
  	Put this in your .cshrc - customize the prompt variable
  	the way you want.
  
! 	    alias cd 'chdir \!* && set prompt="${cwd}% "'
  	
  	If you use pushd and popd, you'll also need
  
! 	    alias pushd 'pushd \!* && set prompt="${cwd}% "'
! 	    alias popd  'popd  \!* && set prompt="${cwd}% "'
  
  	Some C shells don't keep a $cwd variable - you can use
  	`pwd` instead.
--- 138,151 ----
  	Put this in your .cshrc - customize the prompt variable
  	the way you want.
  
! 	    alias setprompt 'set prompt="${cwd}% "'
! 	    setprompt		# to set the initial prompt
! 	    alias cd 'chdir \!* && setprompt'
  	
  	If you use pushd and popd, you'll also need
  
! 	    alias pushd 'pushd \!* && setprompt'
! 	    alias popd  'popd  \!* && setprompt'
  
  	Some C shells don't keep a $cwd variable - you can use
  	`pwd` instead.
***************
*** 145,152 ****
  
  	If you just want the last component of the current directory
  	in your prompt ("mail% " instead of "/usr/spool/mail% ")
! 	you can do
! 	    alias cd 'chdir \!* && set prompt="$cwd:t% "'
  
  	
  	Some older csh's get the meaning of && and || reversed.
--- 152,160 ----
  
  	If you just want the last component of the current directory
  	in your prompt ("mail% " instead of "/usr/spool/mail% ")
! 	you can use
! 
! 	    alias setprompt 'set prompt="$cwd:t% "'
  
  	
  	Some older csh's get the meaning of && and || reversed.
***************
*** 163,169 ****
  	If you have a newer version of the Bourne Shell (SVR2 or newer)
  	you can use a shell function to make your own command, "xcd" say:
  
! 	    xcd { cd $* ; PS1="`pwd` $ "; }
  
  	If you have an older Bourne shell, it's complicated but not impossible.
  	Here's one way.  Add this to your .profile file:
--- 171,177 ----
  	If you have a newer version of the Bourne Shell (SVR2 or newer)
  	you can use a shell function to make your own command, "xcd" say:
  
! 	    xcd() { cd $* ; PS1="`pwd` $ "; }
  
  	If you have an older Bourne shell, it's complicated but not impossible.
  	Here's one way.  Add this to your .profile file:
***************
*** 301,307 ****
      even exist is going to take some time.
  
  
! 9) How do I rename "*.foo" to "*.bar"?
  	
      Why doesn't "mv *.foo *.bar" work?  Think about how the shell
      expands wildcards.   "*.foo" "*.bar" are expanded before the mv
--- 309,315 ----
      even exist is going to take some time.
  
  
! 9) How do I rename "*.foo" to "*.bar", or change file names to lowercase?
  	
      Why doesn't "mv *.foo *.bar" work?  Think about how the shell
      expands wildcards.   "*.foo" "*.bar" are expanded before the mv
***************
*** 345,351 ****
      If you don't have "basename" or want to do something like
      renaming foo.* to bar.*, you can use something like "sed" to
      strip apart the original file name in other ways, but
!     the general looping idea is the same. 
  
      A program called "ren" that does this job nicely was posted
      to comp.sources.unix some time ago.  It lets you use
--- 353,359 ----
      If you don't have "basename" or want to do something like
      renaming foo.* to bar.*, you can use something like "sed" to
      strip apart the original file name in other ways, but
!     the general looping idea is the same.   
  
      A program called "ren" that does this job nicely was posted
      to comp.sources.unix some time ago.  It lets you use
***************
*** 352,357 ****
--- 360,407 ----
  
  	ren '*.foo' '#1.bar'
  
+     Shell loops like the above can also be used to translate
+     file names from upper to lower case or vice versa.  You could use
+     something like this to rename uppercase files to lowercase:
+ 
+ 	C Shell:
+ 	    foreach f ( * )
+ 		mv $f `echo $f | tr A-Z a-z`
+ 	    end
+ 	Bourne Shell:
+ 	    for f in *; do
+ 		mv $f `echo $f | tr A-Z a-z`
+ 	    done
+ 
+     If you wanted to be really thorough and handle files with
+     `funny' names (embedded blanks or whatever) you'd need to use
+     
+ 	Bourne Shell:
+ 
+ 	    for f in *; do
+ 		eval mv '"$i"' \"`echo "$i" | tr '[A-Z]' '[a-z]'`\"
+ 	    done
+     
+     If you have the "perl" language installed, you may find this rename
+     script by Larry Wall very useful.  It can be used to accomplish a
+     wide variety of filename changes.
+ 
+ 	#!/usr/bin/perl
+ 	#
+ 	# rename script examples from lwall:
+ 	#       rename 's/\.orig$//' *.orig
+ 	#       rename 'y/A-Z/a-z/ unless /^Make/' *
+ 	#       rename '$_ .= ".bad"' *.f
+ 	#       rename 'print "$_: "; s/foo/bar/ if <stdin> =~ /^y/i' *
+ 
+ 	$op = shift;
+ 	for (@ARGV) {
+ 	    $was = $_;
+ 	    eval $op;
+ 	    die $@ if $@;
+ 	    rename($was,$_) unless $was eq $_;
+ 	}
+ 
  
  10) Why do I get [some strange error message] when I "rsh host command" ?
  
***************
*** 534,540 ****
      in their names.
  
  
! 16) What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
      stand for?
  
      awk = "Aho Weinberger and Kernighan"
--- 584,611 ----
      in their names.
  
  
! 16) How do I redirect stdout and stderr separately in csh?
! 
!     In csh, you can redirect stdout with ">", or stdout and stderr
!     together with ">&" but there is no direct way to redirect
!     stderr only.  The best you can do is
! 
!         ( command >stdout_file ) >&stderr_file
! 
!     which runs "command" in a subshell;  stdout is redirected inside
!     the subshell to stdout_file, and both stdout and stderr from the
!     subshell are redirected to stderr_file, but by this point stdout
!     has already been redirected so only stderr actually winds up in
!     stderr_file.
! 
! 17) How do I set the permissions on a symbolic link?
! 
!     Permissions on a symbolic link don't really mean anything.  The
!     only permissions that count are the permissions on the file that
!     the link points to.
! 
! 
! 18) What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
      stand for?
  
      awk = "Aho Weinberger and Kernighan"
***************
*** 618,632 ****
  
      biff = "biff"
  
! 	This command, which turns on asynchronous mail notification,
! 	was allegedly named after someone's dog that barked whenever
! 	the postman arrived.  Or so the story goes.
!     
!    
!     Don Libes' book "Life with Unix" contains lots more of
!     these tidbits.
  
! 17) How do I pronounce "vi" ?
  
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
--- 689,711 ----
  
      biff = "biff"
  
!     	This command, which turns on asynchronous mail notification,
! 	was actually named after a dog at Berkeley.
! 
! 	    I can confirm the origin of biff, if you're interested.  Biff
! 	    was Heidi Stettner's dog, back when Heidi (and I, and Bill Joy)
! 	    were all grad students at U.C. Berkeley and the early versions
! 	    of BSD were being developed.   Biff was popular among the
! 	    residents of Evans Hall, and was known for barking at the
! 	    mailman, hence the name of the command.
! 
! 	Confirmation courtesy of Eric Cooper, Carnegie Mellon
! 	University
! 
!     Don Libes' book "Life with Unix" contains lots more of these
!     tidbits.
  
! 19) How do I pronounce "vi" , or "!", or "/*", or ...?
  
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
***************
*** 638,643 ****
--- 717,865 ----
      and that there are lots of ways to say "#" or "/*" or "!" or
      "tty" or "/etc".  No one pronunciation is correct - enjoy the regional
      dialects and accents.  
+ 
+     Since this topic keeps coming up on the net, here is a comprehensive
+     pronunciation list that has made the rounds in the past.
+     Origin unknown - please let me know if you know where it came from,
+     and I'll attribute it properly.
+ 
+ 
+ Names derived from UNIX are marked with *, names derived from C are marked
+ with +, and names deserving futher explanation are marked with a #.  The
+ explanations will be given at the very end.
+ 
+ ------------------------------------------------------------------------------
+ 			   -- SINGLE CHARACTERS --
+ 
+      SPACE, blank
+ 
+ !    EXCLAMATION POINT, exclamation mark, exclamation, exclam, excl, clam,
+ 	bang#, shout, yell, shriek, pling, factorial, ball-bat, smash, cuss,
+ 	wow, hey, boing
+ 
+ "    QUOTATION MARK, quote, double quote, dirk, literal mark, rabbit ears,
+ 	double ping, double glitch
+ 
+ #    CROSSHATCH, pound, pound sign, number, number sign, sharp, octothorpe#,
+ 	hash, fence, crunch, mesh, hex, flash, grid, pig-pen, tictactoe,
+ 	scratch, scratch mark, gardengate, gate, hak, oof, rake, sink
+ 
+ $    DOLLAR SIGN, dollar, cash, currency symbol, buck, string#, escape#, 
+ 	ding, big-money
+ 
+ %    PERCENT SIGN, percent, mod+, shift-5, double-oh-seven, grapes
+ 
+ &    AMPERSAND, and, amper, address+, shift-7, andpersand, snowman,
+ 	bitand+, donald duck#, daemon
+ 
+ '    APOSTROPHE, single quote, quote, tick, prime, irk, pop, spark, glitch
+ 
+ *    ASTERISK, star, splat, spider, aster, times, wildcard*, gear, dingle,
+ 	(Nathan) Hale#, bug, gem, twinkle
+ 
+ ()   PARENTHESES, parens, round brackets, bananas, ears, bowlegs,
+ 	parenthesee (singular only), weapons
+ (    LEFT PARENTHESIS,  paren,  so,      wax,  parenthesee,   open,  sad
+ )    RIGHT PARENTHESIS, thesis, already, wane, unparenthesee, close, happy
+ 
+ +    PLUS SIGN, plus, add, cross, and, intersection, and
+ 
+ ,    COMMA, tail
+ 
+ -    HYPHEN, minus, minus sign, dash, dak, option, flag, negative,
+ 	negative sign, worm, bithorpe#
+ 
+ .    PERIOD, dot, decimal, decimal point, radix point, point, spot, full stop,
+ 	put#, floor
+ 
+ /    SLASH, stroke, virgule, solidus, slant, diagonal, over, slat, slak,
+ 	across#, compress#, spare
+ 
+ :    COLON, two-spot, double dot, dots
+ 
+ ;    SEMICOLON, semi, hybrid
+ 
+ <>   ANGLE BRACKETS, angles, funnels, brokets
+ <    LESS THAN,    less, read from*, from*,        in*,  comesfrom*, crunch,
+ 	sucks
+ >    GREATER THAN, more, write to*,  into/toward*, out*, gazinta*,   zap,
+ 	blows
+ 
+ =    EQUAL SIGN, equals, equal, gets, quadrathorpe#, half-mesh
+ 
+ ?    QUESTION MARK, question, query, whatmark, what, wildchar*, huh, ques,
+ 	kwes, quiz, quark, hook
+ 
+ @    AT SIGN, at, each, vortex, whorl, whirlpool, cyclone, snail, ape, cat,
+ 	snable-a#, trunk-a#, rose, cabbage, Mercantile symbol
+ 
+ []   BRACKETS, square brackets, U-turns, edged parentheses, mimics
+ [    LEFT BRACKET,  bracket,   bra, square,   opensquare
+ ]    RIGHT BRACKET, unbracket, ket, unsquare, close
+ 
+ \    BACKSLASH, reversed virgule, bash, backslant, backwhack, backslat, 
+ 	escape*, backslak, bak, reduce#
+ 
+ ^    CIRCUMFLEX, caret, carrot, hat, cap, uphat, party hat, housetop, 
+ 	up arrow, control, boink, chevron, hiccup, to-the, fang, sharkfin,
+ 	and#, xor+, wok, trap
+ 
+ _    UNDERSCORE, underline, underbar, under, score, backarrow, flatworm, blank
+ 
+ `    GRAVE, grave accent, accent, backquote, left/open quote, backprime, 
+ 	unapostrophe, backspark, birk, blugle, backtick, push, backglitch,
+ 	backping
+ 
+ {}   BRACES, curly braces, squiggly braces, curly brackets, squiggle brackets,
+ 	Tuborgs#, ponds
+ {    LEFT BRACE,  brace,   curly,   leftit, embrace,  openbrace, begin+
+ }    RIGHT BRACE, unbrace, uncurly, rytit,  bracelet, close,     end+
+ 
+ |    VERTICAL BAR, pipe*, pipe to*, vertical line, broken line#, bar, or+,
+ 	bitor+, vert, v-bar, spike, to*, gazinta*, thru*, pipesinta*, tube,
+ 	mark, whack, gutter, wall
+ 
+ ~    TILDE, twiddle, tilda, tildee, wave, squiggle, swung dash, approx, 
+ 	wiggle, enyay#, home*, worm
+ 
+ 
+ 			-- MULTIPLE CHARACTER STRINGS --
+ 
+ !?	interrobang (one overlapped character)
+ /*   	slashterix+
+ */	asterslash+
+ >>	appends*, cat-astrophe
+ ->	arrow+, pointer to+, hiccup+
+ #!	sh'bang, wallop
+ \!*	bash-bang-splat
+ ()	nil#
+ &&	and+, amper-amper, succeeds-then*
+ ||	or+, fails-then*
+ 
+ 
+ 				-- NOTES --
+ 
+ ! bang		comes from old card punch phenom where punching ! code made a
+ 		loud noise
+ # octothorpe	from Bell System
+ $ string	from BASIC
+ $ escape	from TOPS-10
+ & donald duck	from the Danish "Anders And", which means "Donald Duck"
+ * splat		from DEC "spider" glyph
+ * Nathan Hale	"I have but one asterisk for my country."
+ = quadrathorpe	half an octothorpe
+ - bithorpe	half a quadrathorpe (So what's a monothorpe?)
+ . put		Victor Borge on Electric Company
+ / across	APL
+ / compress	APL
+ @ snable-a	from Danish; may translate as "trunk-a"
+ @ trunk-a	"trunk" = "elephant nose"
+ ^ and		from formal logic
+ \ reduce	APL
+ {} Tuborgs	from advertizing for well-known Danish beverage
+ | broken line	EBCDIC has two vertical bars, one solid and one broken.
+ ~ enyay		from the Spanish n-tilde
+ () nil		LISP
  
  
  -- 

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (01/04/90)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions and comp.unix.wizards.

*** /tmp/,RCSt1a13729	Wed Jan  3 15:27:42 1990
--- part2	Wed Jan  3 15:27:30 1990
***************
*** 1,6 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 89/12/01 14:50:10 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
--- 1,6 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/01/03 15:27:26 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
***************
*** 11,42 ****
  This article includes answers to:
  
  
! 	How do I remove a file whose name begins with a "-" ?
! 	How do I remove a file with funny characters in the filename ?
! 	How do I get a recursive directory listing?
! 	How do I get the current directory into my prompt?
! 	How do I read characters from a terminal without requiring the user
! 	    to hit RETURN?
! 	How do I read characters from the terminal in a shell script?
! 	How do I check to see if there are characters to be read without
! 	    actually reading?
! 	How do I find the name of an open file?
! 	How do I rename "*.foo" to "*.bar", or change file names to lowercase?
! 	Why do I get [some strange error message] when I "rsh host command" ?
! 	How do I find out the creation time of a file?
! 	How do I use "rsh" without having the rsh hang around
! 	    until the remote command has completed?
! 	How do I truncate a file?
! 	How do I {set an environment variable, change directory} inside a
! 	    shell script and have that change affect my current shell?
! 	Why doesn't find's "{}" symbol do what I want?
! 	How do I redirect stdout and stderr separately in csh?
! 	How do I set the permissions on a symbolic link?
! 	What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
! 	    stand for?
! 	How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
  
  While these are all legitimate questions, they seem to crop up in
  comp.unix.questions on an annual basis, usually followed by plenty
--- 11,48 ----
  This article includes answers to:
  
  
! 	1)  How do I remove a file whose name begins with a "-" ?
! 	2)  How do I remove a file with funny characters in the filename ?
! 	3)  How do I get a recursive directory listing?
! 	4)  How do I get the current directory into my prompt?
! 	5)  How do I read characters from a terminal without requiring the user
! 	      to hit RETURN?
! 	6)  How do I read characters from the terminal in a shell script?
! 	7)  How do I check to see if there are characters to be read without
! 	      actually reading?
! 	8)  How do I find the name of an open file?
! 	9)  How do I rename "*.foo" to "*.bar", or change file names
! 	      to lowercase?
! 	10) Why do I get [some strange error message] when I
! 	      "rsh host command" ?
! 	11) How do I find out the creation time of a file?
! 	12) How do I use "rsh" without having the rsh hang around
! 	      until the remote command has completed?
! 	13) How do I truncate a file?
! 	14) How do I {set an environment variable, change directory} inside a
! 	      shell script and have that change affect my current shell?
! 	15) Why doesn't find's "{}" symbol do what I want?
! 	16) How do I redirect stdout and stderr separately in csh?
! 	17) How do I set the permissions on a symbolic link?
! 	18) When someone refers to 'rn(1)' or 'ctime(3)', what does
! 	      the number in parentheses mean?
! 	19) What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
! 	      stand for?
! 	20) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
+     If you're looking for the answer to, say, question 14, and want to skip
+     everything else, you can search ahead for the regular expression "^14)".  
  
  While these are all legitimate questions, they seem to crop up in
  comp.unix.questions on an annual basis, usually followed by plenty
***************
*** 231,237 ****
--- 237,250 ----
  	    exit(0);
      }
  
+     You might like to check out the documentation for the "curses"
+     library of portable screen functions.  Often if you're interested
+     in single-character I/O like this, you're also interested in doing
+     some sort of screen display control, and the curses library
+     provides various portable routines for both functions.
  
+ 
+ 
  6)  How do I read characters from the terminal in a shell script?
  
      In sh, use read.  It is most common to use a loop like
***************
*** 366,376 ****
  
  	C Shell:
  	    foreach f ( * )
! 		mv $f `echo $f | tr A-Z a-z`
  	    end
  	Bourne Shell:
  	    for f in *; do
! 		mv $f `echo $f | tr A-Z a-z`
  	    done
  
      If you wanted to be really thorough and handle files with
--- 379,389 ----
  
  	C Shell:
  	    foreach f ( * )
! 		mv $f `echo $f | tr '[A-Z]' '[a-z]'`
  	    end
  	Bourne Shell:
  	    for f in *; do
! 		mv $f `echo $f | tr '[A-Z]' '[a-z]'`
  	    done
  
      If you wanted to be really thorough and handle files with
***************
*** 379,387 ****
  	Bourne Shell:
  
  	    for f in *; do
! 		eval mv '"$i"' \"`echo "$i" | tr '[A-Z]' '[a-z]'`\"
  	    done
      
      If you have the "perl" language installed, you may find this rename
      script by Larry Wall very useful.  It can be used to accomplish a
      wide variety of filename changes.
--- 392,405 ----
  	Bourne Shell:
  
  	    for f in *; do
! 		eval mv '"$f"' \"`echo "$f" | tr '[A-Z]' '[a-z]'`\"
  	    done
      
+     (Some versions of "tr" require the [ and ], some don't.  It happens 
+      to be harmless to include them in this particular example; versions of
+      tr that don't want the [] will conveniently think they are supposed
+      to translate '[' to '[' and ']' to ']').
+ 
      If you have the "perl" language installed, you may find this rename
      script by Larry Wall very useful.  It can be used to accomplish a
      wide variety of filename changes.
***************
*** 563,568 ****
--- 581,593 ----
      You could then use
  
  	find /path -type d -exec ./doit {} \;
+     
+     Or if you want to avoid the "./doit" shell script, you can use
+ 
+ 	find /path -type d -exec sh -c 'command $0/*' {} \;
+     
+     (This works because within the 'command' of "sh -c 'command' A B C ...",
+      $0 expands to A, $1 to B, and so on.)
  
  
      If all you're trying to do is cut down on the number of times
***************
*** 604,611 ****
      only permissions that count are the permissions on the file that
      the link points to.
  
  
! 18) What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
      stand for?
  
      awk = "Aho Weinberger and Kernighan"
--- 629,672 ----
      only permissions that count are the permissions on the file that
      the link points to.
  
+ 18) When someone refers to 'rn(1)' or 'ctime(3)', what does
+     the number in parentheses mean?
  
!     It looks like some sort of function call, but it isn't.
!     These numbers refer to the section of the "Unix manual" where
!     the appropriate documentation can be found.  You could type
!     "man 3 ctime" to look up the manual page for "ctime" in section 3
!     of the manual.
! 
!     The standard manual sections are:
! 
! 	1	User-level  commands
! 	2	System calls
! 	3	Library functions
! 	4	Devices and device drivers
! 	5	File formats
! 	6	Games
! 	7	Various miscellaneous stuff - macro packages etc.
! 	8	System maintenance and operation commands
!     
!     
!     Each section has an introduction, which you can read with "man # intro"
!     where # is the section number.
! 
!     Sometimes the number is necessary to differentiate between a
!     command and a library routine or system call of the same name.  For
!     instance, your system may have "time(1)", a manual page about the
!     'time' command for timing programs, and also "time(3)", a manual
!     page about the 'time' subroutine for determining the current time.
!     You can use "man 1 time" or "man 3 time" to specify which "time"
!     man page you're interested in.
! 
!     You'll often find other sections for local programs or
!     even subsections of the sections above - Ultrix has
!     sections 3m, 3n, 3x and 3yp among others.
! 
! 
! 19) What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
      stand for?
  
      awk = "Aho Weinberger and Kernighan"
***************
*** 705,711 ****
      Don Libes' book "Life with Unix" contains lots more of these
      tidbits.
  
! 19) How do I pronounce "vi" , or "!", or "/*", or ...?
  
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
--- 766,772 ----
      Don Libes' book "Life with Unix" contains lots more of these
      tidbits.
  
! 20) How do I pronounce "vi" , or "!", or "/*", or ...?
  
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
***************
*** 719,862 ****
      dialects and accents.  
  
      Since this topic keeps coming up on the net, here is a comprehensive
!     pronunciation list that has made the rounds in the past.
!     Origin unknown - please let me know if you know where it came from,
!     and I'll attribute it properly.
  
  
  Names derived from UNIX are marked with *, names derived from C are marked
! with +, and names deserving futher explanation are marked with a #.  The
! explanations will be given at the very end.
  
  ------------------------------------------------------------------------------
  			   -- SINGLE CHARACTERS --
  
!      SPACE, blank
  
! !    EXCLAMATION POINT, exclamation mark, exclamation, exclam, excl, clam,
  	bang#, shout, yell, shriek, pling, factorial, ball-bat, smash, cuss,
! 	wow, hey, boing
  
! "    QUOTATION MARK, quote, double quote, dirk, literal mark, rabbit ears,
! 	double ping, double glitch
  
  #    CROSSHATCH, pound, pound sign, number, number sign, sharp, octothorpe#,
  	hash, fence, crunch, mesh, hex, flash, grid, pig-pen, tictactoe,
! 	scratch, scratch mark, gardengate, gate, hak, oof, rake, sink
  
  $    DOLLAR SIGN, dollar, cash, currency symbol, buck, string#, escape#, 
! 	ding, big-money
  
! %    PERCENT SIGN, percent, mod+, shift-5, double-oh-seven, grapes
  
  &    AMPERSAND, and, amper, address+, shift-7, andpersand, snowman,
! 	bitand+, donald duck#, daemon
  
! '    APOSTROPHE, single quote, quote, tick, prime, irk, pop, spark, glitch
  
  *    ASTERISK, star, splat, spider, aster, times, wildcard*, gear, dingle,
! 	(Nathan) Hale#, bug, gem, twinkle
  
! ()   PARENTHESES, parens, round brackets, bananas, ears, bowlegs,
! 	parenthesee (singular only), weapons
! (    LEFT PARENTHESIS,  paren,  so,      wax,  parenthesee,   open,  sad
! )    RIGHT PARENTHESIS, thesis, already, wane, unparenthesee, close, happy
! 
! +    PLUS SIGN, plus, add, cross, and, intersection, and
! 
! ,    COMMA, tail
! 
! -    HYPHEN, minus, minus sign, dash, dak, option, flag, negative,
! 	negative sign, worm, bithorpe#
  
! .    PERIOD, dot, decimal, decimal point, radix point, point, spot, full stop,
! 	put#, floor
  
  /    SLASH, stroke, virgule, solidus, slant, diagonal, over, slat, slak,
! 	across#, compress#, spare
  
! :    COLON, two-spot, double dot, dots
  
! ;    SEMICOLON, semi, hybrid
  
! <>   ANGLE BRACKETS, angles, funnels, brokets
  <    LESS THAN,    less, read from*, from*,        in*,  comesfrom*, crunch,
! 	sucks
  >    GREATER THAN, more, write to*,  into/toward*, out*, gazinta*,   zap,
! 	blows
  
! =    EQUAL SIGN, equals, equal, gets, quadrathorpe#, half-mesh
  
  ?    QUESTION MARK, question, query, whatmark, what, wildchar*, huh, ques,
! 	kwes, quiz, quark, hook
! 
! @    AT SIGN, at, each, vortex, whorl, whirlpool, cyclone, snail, ape, cat,
! 	snable-a#, trunk-a#, rose, cabbage, Mercantile symbol
  
! []   BRACKETS, square brackets, U-turns, edged parentheses, mimics
! [    LEFT BRACKET,  bracket,   bra, square,   opensquare
! ]    RIGHT BRACKET, unbracket, ket, unsquare, close
! 
! \    BACKSLASH, reversed virgule, bash, backslant, backwhack, backslat, 
! 	escape*, backslak, bak, reduce#
! 
! ^    CIRCUMFLEX, caret, carrot, hat, cap, uphat, party hat, housetop, 
! 	up arrow, control, boink, chevron, hiccup, to-the, fang, sharkfin,
! 	and#, xor+, wok, trap
  
! _    UNDERSCORE, underline, underbar, under, score, backarrow, flatworm, blank
  
! `    GRAVE, grave accent, accent, backquote, left/open quote, backprime, 
  	unapostrophe, backspark, birk, blugle, backtick, push, backglitch,
! 	backping
  
  {}   BRACES, curly braces, squiggly braces, curly brackets, squiggle brackets,
! 	Tuborgs#, ponds
! {    LEFT BRACE,  brace,   curly,   leftit, embrace,  openbrace, begin+
! }    RIGHT BRACE, unbrace, uncurly, rytit,  bracelet, close,     end+
  
  |    VERTICAL BAR, pipe*, pipe to*, vertical line, broken line#, bar, or+,
  	bitor+, vert, v-bar, spike, to*, gazinta*, thru*, pipesinta*, tube,
! 	mark, whack, gutter, wall
  
  ~    TILDE, twiddle, tilda, tildee, wave, squiggle, swung dash, approx, 
! 	wiggle, enyay#, home*, worm
  
  
  			-- MULTIPLE CHARACTER STRINGS --
  
  !?	interrobang (one overlapped character)
! /*   	slashterix+
! */	asterslash+
! >>	appends*, cat-astrophe
  ->	arrow+, pointer to+, hiccup+
  #!	sh'bang, wallop
  \!*	bash-bang-splat
  ()	nil#
! &&	and+, amper-amper, succeeds-then*
! ||	or+, fails-then*
  
  
  				-- NOTES --
  
  ! bang		comes from old card punch phenom where punching ! code made a
! 		loud noise
  # octothorpe	from Bell System
  $ string	from BASIC
  $ escape	from TOPS-10
  & donald duck	from the Danish "Anders And", which means "Donald Duck"
  * splat		from DEC "spider" glyph
  * Nathan Hale	"I have but one asterisk for my country."
  = quadrathorpe	half an octothorpe
  - bithorpe	half a quadrathorpe (So what's a monothorpe?)
  . put		Victor Borge on Electric Company
  / across	APL
  / compress	APL
  @ snable-a	from Danish; may translate as "trunk-a"
  @ trunk-a	"trunk" = "elephant nose"
! ^ and		from formal logic
  \ reduce	APL
  {} Tuborgs	from advertizing for well-known Danish beverage
  | broken line	EBCDIC has two vertical bars, one solid and one broken.
  ~ enyay		from the Spanish n-tilde
  () nil		LISP
--- 780,961 ----
      dialects and accents.  
  
      Since this topic keeps coming up on the net, here is a comprehensive
!     pronunciation list that has made the rounds in the past.  This list
!     is maintained by Maarten Litmaath, maart@cs.vu.nl .
  
  
  Names derived from UNIX are marked with *, names derived from C are marked
! with +, names derived from (Net)Hack are marked with & and names deserving
! futher explanation are marked with a #.  The explanations will be given at
! the very end.
  
  ------------------------------------------------------------------------------
  			   -- SINGLE CHARACTERS --
  
!      SPACE, blank, ghost&
  
! !    EXCLAMATION POINT, exclamation (mark), (ex)clam, excl, wow, hey, boing,
  	bang#, shout, yell, shriek, pling, factorial, ball-bat, smash, cuss,
! 	store#, potion&, not*+
  
! "    QUOTATION MARK, (double) quote, dirk, literal mark, rabbit ears,
! 	double ping, double glitch, amulet&, web&
  
  #    CROSSHATCH, pound, pound sign, number, number sign, sharp, octothorpe#,
  	hash, fence, crunch, mesh, hex, flash, grid, pig-pen, tictactoe,
! 	scratch (mark), (garden)gate, hak, oof, rake, sink&, corridor&,
! 	unequal#
  
  $    DOLLAR SIGN, dollar, cash, currency symbol, buck, string#, escape#, 
! 	ding, big-money, gold&
  
! %    PERCENT SIGN, percent, mod+, shift-5, double-oh-seven, grapes, food&
  
  &    AMPERSAND, and, amper, address+, shift-7, andpersand, snowman,
! 	bitand+, donald duck#, daemon&, background*
  
! '    APOSTROPHE, (single) quote, tick, prime, irk, pop, spark, glitch,
! 	lurker above&
  
  *    ASTERISK, star, splat, spider, aster, times, wildcard*, gear, dingle,
! 	(Nathan) Hale#, bug, gem&, twinkle, funny button#, pine cone, glob*
  
! ()   PARENTHESES, parens, round brackets, bananas, ears, bowlegs
! (    LEFT PARENTHESIS,  (open) paren,  so,  wane,  parenthesee,   open,  sad,
! 	tool&
! )    RIGHT PARENTHESIS, already, wax, unparenthesee, close (paren), happy,
! 	thesis, weapon&
! 
! +    PLUS SIGN, plus, add, cross, and, intersection, door&, spellbook&
! 
! ,    COMMA, tail, trapper&
! 
! -    HYPHEN, minus (sign), dash, dak, option, flag, negative (sign), worm,
! 	bithorpe#
  
! .    PERIOD, dot, decimal (point), (radix) point, spot, full stop,
! 	put#, floor&
  
  /    SLASH, stroke, virgule, solidus, slant, diagonal, over, slat, slak,
! 	across#, compress#, spare, divided-by, wand&
  
! :    COLON, two-spot, double dot, dots, chameleon&
  
! ;    SEMICOLON, semi, hybrid, giant eel&, go-on#
  
! <>   ANGLE BRACKETS, angles, funnels, brokets, pointy brackets
  <    LESS THAN,    less, read from*, from*,        in*,  comesfrom*, crunch,
! 	sucks, left chevron#, open pointy (brack[et]), bra#, upstairs&
  >    GREATER THAN, more, write to*,  into/toward*, out*, gazinta*,   zap,
! 	blows, right chevron#, closing pointy (brack[et]), ket#, downstairs&
  
! =    EQUAL SIGN, equal(s), gets, becomes, quadrathorpe#, half-mesh, ring&
  
  ?    QUESTION MARK, question, query, whatmark, what, wildchar*, huh, ques,
! 	kwes, quiz, quark, hook, scroll&
  
! @    AT SIGN, at, each, vortex, whirl, whirlpool, cyclone, snail, ape, cat,
! 	snable-a#, trunk-a#, rose, cabbage, Mercantile symbol, strudel#,
! 	fetch#, shopkeeper&, human&
! 
! []   BRACKETS, square brackets, U-turns, edged parentheses
! [    LEFT BRACKET,  bracket,   bra, (left) square (brack[et]),   opensquare,
! 	armor&
! ]    RIGHT BRACKET, unbracket, ket, right square (brack[et]), unsquare, close,
! 	mimic&
! 
! \    BACKSLASH, reversed virgule, bash, (back)slant, backwhack, backslat, 
! 	escape*, backslak, bak, reduce#, opulent throne&
! 
! ^    CIRCUMFLEX, caret, carrot, (top)hat, cap, uphat, party hat, housetop, 
! 	up arrow, control, boink, chevron, hiccup, power, to-the(-power), fang,
! 	sharkfin, and#, xor+, wok, trap&, pointer#, pipe*
  
! _    UNDERSCORE, underline, underbar, under, score, backarrow, flatworm, blank,
! 	chain&, gets#
  
! `    GRAVE, (grave) accent, backquote, left/open quote, backprime, 
  	unapostrophe, backspark, birk, blugle, backtick, push, backglitch,
! 	backping, execute#, boulder&, rock&
  
  {}   BRACES, curly braces, squiggly braces, curly brackets, squiggle brackets,
! 	Tuborgs#, ponds, curly chevrons#, squirrly braces, hitchcocks#
! {    LEFT BRACE,  brace,   curly,   leftit, embrace,  openbrace, begin+,
! 	fountain&
! }    RIGHT BRACE, unbrace, uncurly, rytit,  bracelet, close,     end+, a pool&
  
  |    VERTICAL BAR, pipe*, pipe to*, vertical line, broken line#, bar, or+,
  	bitor+, vert, v-bar, spike, to*, gazinta*, thru*, pipesinta*, tube,
! 	mark, whack, gutter, wall&
  
  ~    TILDE, twiddle, tilda, tildee, wave, squiggle, swung dash, approx, 
! 	wiggle, enyay#, home*, worm, not+
  
  
  			-- MULTIPLE CHARACTER STRINGS --
  
  !?	interrobang (one overlapped character)
! */	asterslash+, times-div#
! /*   	slashterix+, slashaster
! :=	becomes#
! <-	gets
! <<	left-shift+, double smaller
! <>	unequal#
! >>	appends*, cat-astrophe, right-shift+, double greater
  ->	arrow+, pointer to+, hiccup+
  #!	sh'bang, wallop
  \!*	bash-bang-splat
  ()	nil#
! &&	and+, and-and+, amper-amper, succeeds-then*
! ||	or+, or-or+, fails-then*
  
  
  				-- NOTES --
  
  ! bang		comes from old card punch phenom where punching ! code made a
! 		loud noise; however, this pronunciation is used in the (non-
! 		computerized) publishing and typesetting industry in the U.S.
! 		too, so ...
! ! store		from FORTH
  # octothorpe	from Bell System
+ # unequal	e.g. Modula-2
  $ string	from BASIC
  $ escape	from TOPS-10
  & donald duck	from the Danish "Anders And", which means "Donald Duck"
  * splat		from DEC "spider" glyph
  * Nathan Hale	"I have but one asterisk for my country."
+ * funny button	at Pacific Bell, * was referred to by employees as the "funny
+ 		button", which did not please management at all when it became
+ 		part of the corporate logo of Pacific Telesis, the holding
+ 		company ...
+ */ times-div	from FORTH
  = quadrathorpe	half an octothorpe
  - bithorpe	half a quadrathorpe (So what's a monothorpe?)
  . put		Victor Borge on Electric Company
  / across	APL
  / compress	APL
+ := becomes	e.g. Pascal
+ ; go-on		Algol68
+ < left chevron	from the military: worn vertically on the sleeve to signify
+ 		rating
+ < bra		from quantum mechanics
+ <> unequal	e.g. Pascal
+ > right chevron	see "< left chevron"
+ > ket		from quantum mechanics
  @ snable-a	from Danish; may translate as "trunk-a"
  @ trunk-a	"trunk" = "elephant nose"
! @ strudel	as in Austrian apple cake
! @ fetch		from FORTH
  \ reduce	APL
+ ^ and		from formal logic
+ ^ pointer	from PASCAL
+ _ gets		some alternative representation of underscore resembles a
+ 		backarrow
+ ` execute	from shell command substitution
  {} Tuborgs	from advertizing for well-known Danish beverage
+ {} curly chevr.	see "< left chevron"
+ {} hitchcocks	from the old Alfred Hitchcock show, with the stylized profile
+ 		of the man
  | broken line	EBCDIC has two vertical bars, one solid and one broken.
  ~ enyay		from the Spanish n-tilde
  () nil		LISP

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (02/04/90)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions and comp.unix.wizards.  You can also ftp
the most recent version from iuvax.cs.indiana.edu (129.79.254.192),
where it's "pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".

  
*** /tmp/,RCSt1a01782	Sun Feb  4 03:12:54 1990
--- part2	Sun Feb  4 03:12:44 1990
***************
*** 1,6 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/01/03 15:27:26 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
--- 1,6 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/02/04 03:12:39 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
***************
*** 479,485 ****
  
  	    rsh machine -n 'command >/dev/null 2>&1 </dev/null &' 
  
!     why?  "-n" attaches rsh's stdin to /dev/null so you could run the
      complete rsh command in the background on the LOCAL machine.
      Thus "-n" is equivalent to another specific "< /dev/null".
      Furthermore, the input/output redirections on the REMOTE machine 
--- 479,485 ----
  
  	    rsh machine -n 'command >/dev/null 2>&1 </dev/null &' 
  
!     Why?  "-n" attaches rsh's stdin to /dev/null so you could run the
      complete rsh command in the background on the LOCAL machine.
      Thus "-n" is equivalent to another specific "< /dev/null".
      Furthermore, the input/output redirections on the REMOTE machine 
***************
*** 623,628 ****
--- 623,632 ----
      has already been redirected so only stderr actually winds up in
      stderr_file.
  
+     Sometimes it's easier to let sh do the work for you.
+ 
+ 	sh -c 'command >stdout_file 2>stderr_file'
+ 
  17) How do I set the permissions on a symbolic link?
  
      Permissions on a symbolic link don't really mean anything.  The
***************
*** 650,655 ****
--- 654,662 ----
  	8	System maintenance and operation commands
      
      
+     Some Unix versions use non-numeric section names.  For instance,
+     Xenix uses "C" for commands and "S" for functions.
+ 
      Each section has an introduction, which you can read with "man # intro"
      where # is the section number.
  
***************
*** 766,773 ****
      Don Libes' book "Life with Unix" contains lots more of these
      tidbits.
  
- 20) How do I pronounce "vi" , or "!", or "/*", or ...?
  
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
--- 773,780 ----
      Don Libes' book "Life with Unix" contains lots more of these
      tidbits.
  
  
+ 20) How do I pronounce "vi" , or "!", or "/*", or ...?
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
***************
*** 783,789 ****
      pronunciation list that has made the rounds in the past.  This list
      is maintained by Maarten Litmaath, maart@cs.vu.nl .
  
- 
  Names derived from UNIX are marked with *, names derived from C are marked
  with +, names derived from (Net)Hack are marked with & and names deserving
  futher explanation are marked with a #.  The explanations will be given at
--- 790,795 ----
***************
*** 799,805 ****
  	store#, potion&, not*+
  
  "    QUOTATION MARK, (double) quote, dirk, literal mark, rabbit ears,
! 	double ping, double glitch, amulet&, web&
  
  #    CROSSHATCH, pound, pound sign, number, number sign, sharp, octothorpe#,
  	hash, fence, crunch, mesh, hex, flash, grid, pig-pen, tictactoe,
--- 805,811 ----
  	store#, potion&, not*+
  
  "    QUOTATION MARK, (double) quote, dirk, literal mark, rabbit ears,
! 	double ping, double glitch, amulet&, web&, inverted commas
  
  #    CROSSHATCH, pound, pound sign, number, number sign, sharp, octothorpe#,
  	hash, fence, crunch, mesh, hex, flash, grid, pig-pen, tictactoe,
***************
*** 837,843 ****
  	put#, floor&
  
  /    SLASH, stroke, virgule, solidus, slant, diagonal, over, slat, slak,
! 	across#, compress#, spare, divided-by, wand&
  
  :    COLON, two-spot, double dot, dots, chameleon&
  
--- 843,849 ----
  	put#, floor&
  
  /    SLASH, stroke, virgule, solidus, slant, diagonal, over, slat, slak,
! 	across#, compress#, spare, divided-by, wand&, forward slash
  
  :    COLON, two-spot, double dot, dots, chameleon&
  
***************
*** 865,880 ****
  	mimic&
  
  \    BACKSLASH, reversed virgule, bash, (back)slant, backwhack, backslat, 
! 	escape*, backslak, bak, reduce#, opulent throne&
  
  ^    CIRCUMFLEX, caret, carrot, (top)hat, cap, uphat, party hat, housetop, 
  	up arrow, control, boink, chevron, hiccup, power, to-the(-power), fang,
! 	sharkfin, and#, xor+, wok, trap&, pointer#, pipe*
  
  _    UNDERSCORE, underline, underbar, under, score, backarrow, flatworm, blank,
! 	chain&, gets#
  
! `    GRAVE, (grave) accent, backquote, left/open quote, backprime, 
  	unapostrophe, backspark, birk, blugle, backtick, push, backglitch,
  	backping, execute#, boulder&, rock&
  
--- 871,886 ----
  	mimic&
  
  \    BACKSLASH, reversed virgule, bash, (back)slant, backwhack, backslat, 
! 	escape*, backslak, bak, reduce#, opulent throne&, slosh
  
  ^    CIRCUMFLEX, caret, carrot, (top)hat, cap, uphat, party hat, housetop, 
  	up arrow, control, boink, chevron, hiccup, power, to-the(-power), fang,
! 	sharkfin, and#, xor+, wok, trap&, pointer#, pipe*, upper-than#
  
  _    UNDERSCORE, underline, underbar, under, score, backarrow, flatworm, blank,
! 	chain&, gets#, dash#
  
! `    GRAVE, (grave/acute) accent, backquote, left/open quote, backprime, 
  	unapostrophe, backspark, birk, blugle, backtick, push, backglitch,
  	backping, execute#, boulder&, rock&
  
***************
*** 917,923 ****
  		computerized) publishing and typesetting industry in the U.S.
  		too, so ...
  ! store		from FORTH
! # octothorpe	from Bell System
  # unequal	e.g. Modula-2
  $ string	from BASIC
  $ escape	from TOPS-10
--- 923,929 ----
  		computerized) publishing and typesetting industry in the U.S.
  		too, so ...
  ! store		from FORTH
! # octothorpe	from Bell System (orig. octalthorpe)
  # unequal	e.g. Modula-2
  $ string	from BASIC
  $ escape	from TOPS-10
***************
*** 931,937 ****
  */ times-div	from FORTH
  = quadrathorpe	half an octothorpe
  - bithorpe	half a quadrathorpe (So what's a monothorpe?)
! . put		Victor Borge on Electric Company
  / across	APL
  / compress	APL
  := becomes	e.g. Pascal
--- 937,944 ----
  */ times-div	from FORTH
  = quadrathorpe	half an octothorpe
  - bithorpe	half a quadrathorpe (So what's a monothorpe?)
! . put		Victor Borge's Phonetic Punctuation which dates back to the
! 		middle 1950's
  / across	APL
  / compress	APL
  := becomes	e.g. Pascal
***************
*** 949,956 ****
--- 956,965 ----
  \ reduce	APL
  ^ and		from formal logic
  ^ pointer	from PASCAL
+ ^ upper-than	cf. > and <
  _ gets		some alternative representation of underscore resembles a
  		backarrow
+ _ dash		as distinct from '-' == minus
  ` execute	from shell command substitution
  {} Tuborgs	from advertizing for well-known Danish beverage
  {} curly chevr.	see "< left chevron"
***************
*** 959,965 ****
  | broken line	EBCDIC has two vertical bars, one solid and one broken.
  ~ enyay		from the Spanish n-tilde
  () nil		LISP
- 
  
  -- 
  Steve Hayman    Workstation Manager    Computer Science Department   Indiana U.
--- 968,973 ----

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (03/02/90)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions and comp.unix.wizards.  You can also ftp
the most recent version from iuvax.cs.indiana.edu (129.79.254.192),
where it's "pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".

*** /tmp/,RCSt1a02076	Fri Mar  2 00:53:33 1990
--- part2	Fri Mar  2 00:49:46 1990
***************
*** 38,44 ****
  	      the number in parentheses mean?
  	19) What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
  	      stand for?
! 	20) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
--- 38,46 ----
  	      the number in parentheses mean?
  	19) What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
  	      stand for?
! 	20) How does the gateway between "comp.unix.questions" and the
! 	    "info-unix" mailing list work?
! 	21) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
***************
*** 471,476 ****
--- 473,485 ----
      	    rsh machine command &
      or      rsh machine 'command &'
  
+     For instance, try doing   rsh machine 'sleep 60 &'
+     and you'll see that the 'rsh' won't exit right away.
+     It will wait 60 seconds until the remote 'sleep' command
+     finishes, even though that command was started in the
+     background on the remote machine.  So how do you get
+     the 'rsh' to exit immediately after the 'sleep' is started?
+ 
      The solution - if you use csh on the remote machine:
  
  	    rsh machine -n 'command >&/dev/null </dev/null &' 
***************
*** 666,672 ****
      'time' command for timing programs, and also "time(3)", a manual
      page about the 'time' subroutine for determining the current time.
      You can use "man 1 time" or "man 3 time" to specify which "time"
!     Man page you're interested in.
  
      You'll often find other sections for local programs or
      even subsections of the sections above - Ultrix has
--- 675,681 ----
      'time' command for timing programs, and also "time(3)", a manual
      page about the 'time' subroutine for determining the current time.
      You can use "man 1 time" or "man 3 time" to specify which "time"
!     man page you're interested in.
  
      You'll often find other sections for local programs or
      even subsections of the sections above - Ultrix has
***************
*** 774,780 ****
      tidbits.
  
  
! 20) How do I pronounce "vi" , or "!", or "/*", or ...?
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
--- 783,842 ----
      tidbits.
  
  
! 20) How does the gateway between "comp.unix.questions" and the
!     "info-unix" mailing list work?
! 
!     "Info-Unix" and "Unix-Wizards" are mailing list versions of
!     comp.unix.questions and comp.unix.wizards respectively.
!     There should be no difference in content between the
!     mailing list and the newsgroup.   
! 
!     To get on or off either of these lists, send mail to
!     Info-Unix-Request@brl.mil or Unix-Wizards-Request@brl.mil .
!     Be sure to use the '-Request'.  Don't expect an immediate response.
! 
!     Here are the gory details, courtesy of the list's maintainer, Bob Reschly.
! 
!     ==== postings to info-UNIX and UNIX-wizards lists ====
! 
!        Anything submitted to the list is posted; I do not moderate incoming
!     traffic -- BRL functions as a reflector.  Postings submitted by Internet
!     subscribers should be addressed to the list address (info-UNIX or UNIX-
!     wizards);  the '-request' addresses are for correspondence with the list
!     maintainer [me].  Postings submitted by USENET readers should be
!     addressed to the appropriate news group (comp.unix.questions or
!     comp.unix.wizards).
! 
!        For Internet subscribers, received traffic will be of two types;
!     individual messages, and digests.  Traffic which comes to BRL from the
!     Internet and BITNET (via the BITNET-Internet gateway) is immediately
!     resent to all addressees on the mailing list.  Traffic originating on
!     USENET is gathered up into digests which are sent to all list members
!     daily.
! 
!        BITNET traffic is much like Internet traffic.  The main difference is
!     that I maintain only one address for traffic destined to all BITNET
!     subscribers. That address points to a list exploder which then sends
!     copies to individual BITNET subscribers.  This way only one copy of a
!     given message has to cross the BITNET-Internet gateway in either
!     direction.
! 
!        USENET subscribers see only individual messages.  All messages
!     originating on the Internet side are forwarded to our USENET machine.
!     They are then posted to the appropriate newsgroup.  Unfortunately,
!     for gatewayed messages, the sender becomes "news@brl-adm".  This is
!     currently an unavoidable side-effect of the software which performs the
!     gateway function.
! 
!        As for readership, USENET has an extremely large readership - I would
!     guess several thousand hosts and tens of thousands of readers.  The
!     master list maintained here at BRL runs about two hundred fifty entries
!     with roughly ten percent of those being local redistribution lists.
!     I don't have a good feel for the size of the BITNET redistribution, but
!     I would guess it is roughly the same size and composition as the master
!     list.  Traffic runs 150K to 400K bytes per list per week on average.
! 
! 21) How do I pronounce "vi" , or "!", or "/*", or ...?
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
***************
*** 843,849 ****
  	put#, floor&
  
  /    SLASH, stroke, virgule, solidus, slant, diagonal, over, slat, slak,
! 	across#, compress#, spare, divided-by, wand&, forward slash
  
  :    COLON, two-spot, double dot, dots, chameleon&
  
--- 905,912 ----
  	put#, floor&
  
  /    SLASH, stroke, virgule, solidus, slant, diagonal, over, slat, slak,
! 	across#, compress#, reduce#, replicate#, spare, divided-by, wand&,
! 	forward slash
  
  :    COLON, two-spot, double dot, dots, chameleon&
  
***************
*** 871,877 ****
  	mimic&
  
  \    BACKSLASH, reversed virgule, bash, (back)slant, backwhack, backslat, 
! 	escape*, backslak, bak, reduce#, opulent throne&, slosh
  
  ^    CIRCUMFLEX, caret, carrot, (top)hat, cap, uphat, party hat, housetop, 
  	up arrow, control, boink, chevron, hiccup, power, to-the(-power), fang,
--- 934,940 ----
  	mimic&
  
  \    BACKSLASH, reversed virgule, bash, (back)slant, backwhack, backslat, 
! 	escape*, backslak, bak, scan#, expand#, opulent throne&, slosh, slope
  
  ^    CIRCUMFLEX, caret, carrot, (top)hat, cap, uphat, party hat, housetop, 
  	up arrow, control, boink, chevron, hiccup, power, to-the(-power), fang,
***************
*** 894,900 ****
  	bitor+, vert, v-bar, spike, to*, gazinta*, thru*, pipesinta*, tube,
  	mark, whack, gutter, wall&
  
! ~    TILDE, twiddle, tilda, tildee, wave, squiggle, swung dash, approx, 
  	wiggle, enyay#, home*, worm, not+
  
  
--- 957,963 ----
  	bitor+, vert, v-bar, spike, to*, gazinta*, thru*, pipesinta*, tube,
  	mark, whack, gutter, wall&
  
!  ~   TILDE, twiddle, tilda, tildee, wave, squiggle, swung dash, approx, 
  	wiggle, enyay#, home*, worm, not+
  
  
***************
*** 941,946 ****
--- 1004,1011 ----
  		middle 1950's
  / across	APL
  / compress	APL
+ / reduce	APL
+ / replicate	APL
  := becomes	e.g. Pascal
  ; go-on		Algol68
  < left chevron	from the military: worn vertically on the sleeve to signify
***************
*** 953,959 ****
  @ trunk-a	"trunk" = "elephant nose"
  @ strudel	as in Austrian apple cake
  @ fetch		from FORTH
! \ reduce	APL
  ^ and		from formal logic
  ^ pointer	from PASCAL
  ^ upper-than	cf. > and <
--- 1018,1025 ----
  @ trunk-a	"trunk" = "elephant nose"
  @ strudel	as in Austrian apple cake
  @ fetch		from FORTH
! \ scan		APL
! \ expand	APL
  ^ and		from formal logic
  ^ pointer	from PASCAL
  ^ upper-than	cf. > and <
***************
*** 966,974 ****
  {} hitchcocks	from the old Alfred Hitchcock show, with the stylized profile
  		of the man
  | broken line	EBCDIC has two vertical bars, one solid and one broken.
! ~ enyay		from the Spanish n-tilde
  () nil		LISP
- 
  -- 
  Steve Hayman    Workstation Manager    Computer Science Department   Indiana U.
  sahayman@iuvax.cs.indiana.edu     iuvax!sahayman                 (812) 855-6984
--- 1032,1039 ----
  {} hitchcocks	from the old Alfred Hitchcock show, with the stylized profile
  		of the man
  | broken line	EBCDIC has two vertical bars, one solid and one broken.
!  ~ enyay	from the Spanish n-tilde
  () nil		LISP
  -- 
  Steve Hayman    Workstation Manager    Computer Science Department   Indiana U.
  sahayman@iuvax.cs.indiana.edu     iuvax!sahayman                 (812) 855-6984

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (06/02/90)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions and comp.unix.wizards.  You can also ftp
the most recent version from iuvax.cs.indiana.edu (129.79.254.192),
where it's "pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".


And now an apology.  Normally the diffs would appear here but my
diff-making script messed up.  The diffs will return next month.

Question 21 ("How do I undelete a file") is the only addition this month.

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (07/03/90)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions and comp.unix.wizards.  You can also ftp
the most recent version from iuvax.cs.indiana.edu (129.79.254.192),
where it's "pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".

*** /tmp/,RCSt1a09210	Mon Jul  2 16:41:57 1990
--- part2	Mon Jul  2 16:39:06 1990
***************
*** 1,6 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/06/01 14:28:10 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
--- 1,6 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/07/02 16:38:51 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
***************
*** 41,47 ****
  	20) How does the gateway between "comp.unix.questions" and the
  	    "info-unix" mailing list work?
  	21) How do I "undelete" a file?
! 	22) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
--- 41,48 ----
  	20) How does the gateway between "comp.unix.questions" and the
  	    "info-unix" mailing list work?
  	21) How do I "undelete" a file?
! 	22) How can a process detect if it's running in the background?
! 	23) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
***************
*** 94,105 ****
  
  	rm -ri .
  
! 	which asks you whether to remove each file in the directory,
! 	answer "y" to the problem file and "n" to everything else,
! 	and which, unfortunately, doesn't work with many versions of rm
! 	(always take a deep breath and think about what you're doing
! 	and double check what you typed when you use rm's "-r" flag);
  
      and
  
  	find . -type f ... -ok rm '{}' \;
--- 95,111 ----
  
  	rm -ri .
  
! 	which asks you whether to remove each file in the directory.
! 	Answer "y" to the problem file and "n" to everything else.
! 	Unfortunately this doesn't work with many versions of rm.
! 	Also unfortunately, this will walk through every subdirectory
! 	of ".", so you might want to "chmod a-x" those directories
! 	temporarily to make them unsearchable.
  
+ 	Always take a deep breath and think about what you're doing
+ 	and double check what you typed when you use rm's "-r" flag
+ 	or a wildcard on the command line;
+ 
      and
  
  	find . -type f ... -ok rm '{}' \;
***************
*** 187,192 ****
--- 193,199 ----
  
  		LOGIN_SHELL=$$ export LOGIN_SHELL
  		CMDFILE=/tmp/cd.$$ export CMDFILE
+ 		# 16 is SIGURG, pick some signal that isn't likely to be used
  		PROMPTSIG=16 export PROMPTSIG
  		trap '. $CMDFILE' $PROMPTSIG
  
***************
*** 212,218 ****
--- 219,237 ----
  	If you just want the last component of the directory, use
  		PS1='${PWD##*/} $ '
  
+     T C shell (tcsh)
+ 
+ 	Tcsh is a popular enhanced version of csh with some extra
+ 	builtin variables (and many other features):
+ 
+ 	    %~		the current directory, using ~ for $HOME
+ 	    %d or %/	the full pathname of the current directory
+ 	    %c or %.	the trailing component of the current directory
+ 
+ 	so you can do
  
+ 	    set prompt='%~ '
+ 	    
  5)  How do I read characters from a terminal without requiring the user
      to hit RETURN?
  
***************
*** 223,228 ****
--- 242,248 ----
      program do the work - but this is slow and inefficient, and you
      should change the code to do it right some time:
  
+     #include <stdio.h>
      main()
      {
  	    int c;
***************
*** 232,238 ****
  	     * ioctl() would be better here; only lazy
  	     * programmers do it this way:
  	     */
! 	    system("/bin/stty cbreak");
  	    c = getchar();
  	    system("/bin/stty -cbreak");
  	    printf("Thank you for typing %c.\n", c);
--- 252,258 ----
  	     * ioctl() would be better here; only lazy
  	     * programmers do it this way:
  	     */
! 	    system("/bin/stty cbreak");        /* or "stty raw" */
  	    c = getchar();
  	    system("/bin/stty -cbreak");
  	    printf("Thank you for typing %c.\n", c);
***************
*** 272,278 ****
      the terminal, you can try something like
  
  	    echo -n "Enter a character: "
! 	    stty cbreak
  	    readchar=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
  	    stty -cbreak
  
--- 292,298 ----
      the terminal, you can try something like
  
  	    echo -n "Enter a character: "
! 	    stty cbreak		# or  stty raw
  	    readchar=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
  	    stty -cbreak
  
***************
*** 292,300 ****
      whether a read() call on a given file descriptor will block.
  
      There is no way to check whether characters are available to be
!     read from a FILE pointer.  (Well, there is no *good* way.  You could
!     poke around inside stdio data structures to see if the input buffer
!     is nonempty but this is a bad idea, forget about it.)
  
      Sometimes people ask this question with the intention of writing
  	    if (characters available from fd)
--- 312,321 ----
      whether a read() call on a given file descriptor will block.
  
      There is no way to check whether characters are available to be
!     read from a FILE pointer.  (You could poke around inside stdio data
!     structures to see if the input buffer is nonempty, but that wouldn't
!     work since you'd have no way of knowing what will happen the next
!     time you try to fill the buffer.)
  
      Sometimes people ask this question with the intention of writing
  	    if (characters available from fd)
***************
*** 369,376 ****
      If you don't have "basename" or want to do something like
      renaming foo.* to bar.*, you can use something like "sed" to
      strip apart the original file name in other ways, but
!     the general looping idea is the same.   
  
      A program called "ren" that does this job nicely was posted
      to comp.sources.unix some time ago.  It lets you use
  
--- 390,401 ----
      If you don't have "basename" or want to do something like
      renaming foo.* to bar.*, you can use something like "sed" to
      strip apart the original file name in other ways, but
!     the general looping idea is the same.  You can also convert
!     file names into "mv" commands with 'sed', and hand the commands
!     off to "sh" for execution.  Try
  
+ 	ls -d *.foo | sed -e 's/.*/mv & &/' -e 's/foo$/bar/' | sh
+ 
      A program called "ren" that does this job nicely was posted
      to comp.sources.unix some time ago.  It lets you use
  
***************
*** 496,503 ****
      (inside the single quotes) ensure that rsh thinks the session can
      be terminated (there's no data flow any more.)
  
!     Note: on the remote machine, you needn't redirect to/from
!     /dev/null; any ordinary file will do.
  
      In many cases, various parts of these complicated commands
      aren't necessary.
--- 521,528 ----
      (inside the single quotes) ensure that rsh thinks the session can
      be terminated (there's no data flow any more.)
  
!     Note: The file that you redirect to/from on the remote machine
!     doesn't have to be /dev/null; any ordinary file will do.
  
      In many cases, various parts of these complicated commands
      aren't necessary.
***************
*** 579,585 ****
  	command {}/*
  	...
  
!     once for each directory.  This might be a bug, it might be a feature
      but we're stuck with the current behaviour.
  
      So how do you get around this?  One way would be to write a
--- 604,610 ----
  	command {}/*
  	...
  
!     once for each directory.  This might be a bug, it might be a feature,
      but we're stuck with the current behaviour.
  
      So how do you get around this?  One way would be to write a
***************
*** 599,605 ****
--- 624,635 ----
      (This works because within the 'command' of "sh -c 'command' A B C ...",
       $0 expands to A, $1 to B, and so on.)
  
+     or you can use the construct-a-command-with-sed trick
+ 
+ 	find /path -type d -print | sed 's:.*:command &/*:' | sh
+ 
  
+ 
      If all you're trying to do is cut down on the number of times
      that "command" is executed, you should see if your system
      has the "xargs" command.  Xargs reads arguments one line at a time
***************
*** 652,658 ****
      "man 3 ctime" to look up the manual page for "ctime" in section 3
      of the manual.
  
!     The standard manual sections are:
  
  	1	User-level  commands
  	2	System calls
--- 682,688 ----
      "man 3 ctime" to look up the manual page for "ctime" in section 3
      of the manual.
  
!     The traditional manual sections are:
  
  	1	User-level  commands
  	2	System calls
***************
*** 700,715 ****
  
  	where "re" is a "regular expression".
      
!     fgrep = "Fixed Grep".
  
  	fgrep searches for fixed strings only.  The "f" does not
  	stand for "fast" - in fact, "fgrep foobar *.c" is usually slower
! 	than "egrep foobar *.c"  (yes, this is kind of surprising. Try it.)
  
  	Fgrep still has its uses though, and may be useful when searching
  	a file for a larger number of strings than egrep can handle.
  
!     egrep = "Extended Grep"
  
  	egrep uses fancier regular expressions than grep.
  	Many people use egrep all the time, since it has some more
--- 730,745 ----
  
  	where "re" is a "regular expression".
      
!     fgrep = "Fixed GREP".
  
  	fgrep searches for fixed strings only.  The "f" does not
  	stand for "fast" - in fact, "fgrep foobar *.c" is usually slower
! 	than "egrep foobar *.c"  (Yes, this is kind of surprising. Try it.)
  
  	Fgrep still has its uses though, and may be useful when searching
  	a file for a larger number of strings than egrep can handle.
  
!     egrep = "Extended GREP"
  
  	egrep uses fancier regular expressions than grep.
  	Many people use egrep all the time, since it has some more
***************
*** 716,722 ****
  	sophisticated internal algorithms than grep or fgrep,
  	and is usually the fastest of the three programs.
  
!     cat = "catenate"
  
  	catenate is an obscure word meaning "to connect in a series",
  	which is what the "cat" command does to one or more files.
--- 746,752 ----
  	sophisticated internal algorithms than grep or fgrep,
  	and is usually the fastest of the three programs.
  
!     cat = "CATenate"
  
  	catenate is an obscure word meaning "to connect in a series",
  	which is what the "cat" command does to one or more files.
***************
*** 740,746 ****
      troff = "Typesetter ROFF"
  	
  	These are descendants of "roff", which was a re-implementation
! 	of the Multics "runoff" program.
  	
      tee	= T
  
--- 770,777 ----
      troff = "Typesetter ROFF"
  	
  	These are descendants of "roff", which was a re-implementation
! 	of the Multics "runoff" program (a program that you'd use to
! 	"run off" a good copy of a document).
  	
      tee	= T
  
***************
*** 843,848 ****
--- 874,883 ----
      and find you just deleted "*" instead of "*.foo".  Consider it a rite
      of passage.
  
+     Of course, any decent systems administrator should be doing regular
+     backups.  Check with your sysadmin to see if a recent backup copy
+     of your file is available.  But if it isn't, read on.
+ 
      For all intents and purposes, when you delete a file with "rm" it is
      gone.  Once you "rm" a file, the system totally forgets which blocks
      scattered around the disk comprised your file.  Even worse, the blocks
***************
*** 888,894 ****
      complete replacement for rm which allows file recovery.  This
      package was posted to comp.sources.unix (volume 18, issue 73).
  
! 22) How do I pronounce "vi" , or "!", or "/*", or ...?
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
--- 923,950 ----
      complete replacement for rm which allows file recovery.  This
      package was posted to comp.sources.unix (volume 18, issue 73).
  
! 
! 22) How can a process detect if it's running in the background?
! 
!     In general, you can't.  The fundamental problem is that different
!     shells and different versions of UNIX have different notions of
!     what "foreground" and "background" mean - and on the most common
!     type of system with a better-defined notion of what they mean,
!     programs can be moved arbitrarily between foreground and background!
! 
!     UNIX systems without job control typically put a process into the
!     background by ignoring SIGINT and SIGQUIT and redirecting the standard
!     input to "/dev/null"; this is done by the shell.
! 
!     Shells that support job control, on UNIX systems that support job
!     control, put a process into the background by giving it a process group
!     ID different from the process group to which the terminal belongs.  They
!     move it back into the foreground by setting the terminal's process group
!     ID to that of the process.  Shells that do *not* support job control, on
!     UNIX systems that support job control, typically do what shells do on
!     systems that don't support job control.
! 
! 23) How do I pronounce "vi" , or "!", or "/*", or ...?
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
***************
*** 904,909 ****
--- 960,969 ----
      pronunciation list that has made the rounds in the past.  This list
      is maintained by Maarten Litmaath, maart@cs.vu.nl .
  
+ 			The Pronunciation Guide
+ 			-----------------------
+ 			      version 2.1
+ 
  Names derived from UNIX are marked with *, names derived from C are marked
  with +, names derived from (Net)Hack are marked with & and names deserving
  futher explanation are marked with a #.  The explanations will be given at
***************
*** 922,938 ****
  	double ping, double glitch, amulet&, web&, inverted commas
  
  #    CROSSHATCH, pound, pound sign, number, number sign, sharp, octothorpe#,
! 	hash, fence, crunch, mesh, hex, flash, grid, pig-pen, tictactoe,
! 	scratch (mark), (garden)gate, hak, oof, rake, sink&, corridor&,
! 	unequal#
  
  $    DOLLAR SIGN, dollar, cash, currency symbol, buck, string#, escape#, 
! 	ding, big-money, gold&
  
  %    PERCENT SIGN, percent, mod+, shift-5, double-oh-seven, grapes, food&
  
  &    AMPERSAND, and, amper, address+, shift-7, andpersand, snowman,
! 	bitand+, donald duck#, daemon&, background*
  
  '    APOSTROPHE, (single) quote, tick, prime, irk, pop, spark, glitch,
  	lurker above&
--- 982,998 ----
  	double ping, double glitch, amulet&, web&, inverted commas
  
  #    CROSSHATCH, pound, pound sign, number, number sign, sharp, octothorpe#,
! 	hash, (garden) fence, crunch, mesh, hex, flash, grid, pig-pen,
! 	tictactoe, scratch (mark), (garden) gate, hak, oof, rake, sink&,
! 	corridor&, unequal#
  
  $    DOLLAR SIGN, dollar, cash, currency symbol, buck, string#, escape#, 
! 	ding, big-money, gold&, Sonne#
  
  %    PERCENT SIGN, percent, mod+, shift-5, double-oh-seven, grapes, food&
  
  &    AMPERSAND, and, amper, address+, shift-7, andpersand, snowman,
! 	bitand+, donald duck#, daemon&, background*, pretzel
  
  '    APOSTROPHE, (single) quote, tick, prime, irk, pop, spark, glitch,
  	lurker above&
***************
*** 958,964 ****
  
  /    SLASH, stroke, virgule, solidus, slant, diagonal, over, slat, slak,
  	across#, compress#, reduce#, replicate#, spare, divided-by, wand&,
! 	forward slash
  
  :    COLON, two-spot, double dot, dots, chameleon&
  
--- 1018,1024 ----
  
  /    SLASH, stroke, virgule, solidus, slant, diagonal, over, slat, slak,
  	across#, compress#, reduce#, replicate#, spare, divided-by, wand&,
! 	forward slash, shilling#
  
  :    COLON, two-spot, double dot, dots, chameleon&
  
***************
*** 1040,1045 ****
--- 1100,1111 ----
  		loud noise; however, this pronunciation is used in the (non-
  		computerized) publishing and typesetting industry in the U.S.
  		too, so ...
+ 		Alternatively it could have come from comic books, where the
+ 		words each character utters are shown in a "balloon" near that
+ 		character's head.  When one character shoots another, it is
+ 		common to see a balloon pointing at the barrel of the gun to
+ 		denote that the gun had been fired, not merely aimed. 
+ 		That balloon contained the word "!" -- hence, "!" == "Bang!" 
  ! store		from FORTH
  ! dammit	as in "quit, dammit!" while exiting vi and hoping one hasn't
  		clobbered a file too badly
***************
*** 1047,1052 ****
--- 1113,1131 ----
  # unequal	e.g. Modula-2
  $ string	from BASIC
  $ escape	from TOPS-10
+ $ Sonne		In the "socialist" countries they used and are using all kinds
+ 		of IBM clones (hardware + sw). It was a common practice just
+ 		to rename everything (IBM 360 --> ESER 1040 etc.).
+ 		Of course the "dollar" sign had to be renamed - it became the
+ 		"international currency symbol" which looks like a circle with
+ 		4 rays spreading from it:
+ 
+ 			\ /
+ 			 O
+ 			/ \
+ 
+ 		Because it looks like a (small) shining sun it was usually
+ 		called "Sonne" (sun).
  & donald duck	from the Danish "Anders And", which means "Donald Duck"
  * splat		from DEC "spider" glyph
  * Nathan Hale	"I have but one asterisk for my country."
***************
*** 1063,1068 ****
--- 1142,1148 ----
  / compress	APL
  / reduce	APL
  / replicate	APL
+ / shilling	from the British currency symbol
  := becomes	e.g. Pascal
  ; go-on		Algol68
  < left chevron	from the military: worn vertically on the sleeve to signify

peter@ficc.ferranti.com (Peter da Silva) (07/06/90)

In article <49557@iuvax.cs.indiana.edu> sahayman@iuvax.cs.indiana.edu (Steve Hayman) writes:
> ! 22) How can a process detect if it's running in the background?

	First of all: do you want to know if you're running in the background,
	or if you're running interactively? If you're deciding whether or
	not you should print prompts and the like, that's probably a better
	criterion. Check if standard input is a terminal:

		sh: if [ -t 0 ]; then ... fi
		C: if(isatty(0)) { ... }
-- 
Peter da Silva.   `-_-'
+1 713 274 5180.
<peter@ficc.ferranti.com>

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (08/02/90)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions and comp.unix.wizards.  You can also ftp
the most recent version from iuvax.cs.indiana.edu (129.79.254.192),
where it's "pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".

*** /tmp/,RCSt1a24956	Wed Aug  1 23:45:35 1990
--- part1	Wed Aug  1 23:44:05 1990
***************
*** 1,6 ****
  Subject: Welcome to comp.unix.questions and comp.unix.wizards [Monthly posting]
  
! [Last changed: $Date: 90/03/02 00:49:37 $ by $Author: sahayman $]
  
  Comp.unix.questions and comp.unix.wizards are two of the most popular
  and highest volume newsgroups on Usenet.  This article is a monthly
--- 1,6 ----
  Subject: Welcome to comp.unix.questions and comp.unix.wizards [Monthly posting]
  
! [Last changed: $Date: 90/08/01 23:43:59 $ by $Author: sahayman $]
  
  Comp.unix.questions and comp.unix.wizards are two of the most popular
  and highest volume newsgroups on Usenet.  This article is a monthly
***************
*** 83,88 ****
--- 83,91 ----
  comp.unix.questions or comp.unix.wizards.  These include:
  
      comp.lang.c		General discussion of the C language
+ 			(comp.lang.c has its own "Frequently Asked Questions"
+ 			 list - be sure to check it out before posting a
+ 			 question to that group.)
      comp.std.c		Discussion of the ANSI/ISO C standard
      comp.std.unix	Discussion of Unix standards and particularly
  			the IEEE 1003 POSIX standard.
*** /tmp/,RCSt1a24981	Wed Aug  1 23:45:38 1990
--- part2	Wed Aug  1 23:44:11 1990
***************
*** 1,6 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/07/02 16:38:51 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
--- 1,6 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/08/01 23:44:07 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
***************
*** 42,48 ****
  	    "info-unix" mailing list work?
  	21) How do I "undelete" a file?
  	22) How can a process detect if it's running in the background?
! 	23) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
--- 42,49 ----
  	    "info-unix" mailing list work?
  	21) How do I "undelete" a file?
  	22) How can a process detect if it's running in the background?
! 	23) How can an executing program determine its own pathname?
! 	24) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
***************
*** 485,492 ****
      time (shown by "ls -l"), a last-accessed time (shown by "ls -lu")
      and an inode change time (shown by "ls -lc"). The latter is often
      referred to as the "creation time" - even in some man pages -  but
!     that's wrong; it's the time the file's status was last changed,
!     either by writing or changing the inode (via mv or chmod, etc...).
  
      The man page for "stat(2)" discusses this.
  
--- 486,493 ----
      time (shown by "ls -l"), a last-accessed time (shown by "ls -lu")
      and an inode change time (shown by "ls -lc"). The latter is often
      referred to as the "creation time" - even in some man pages -  but
!     that's wrong; it's also set by such operations as mv, ln,
!     chmod, chown and chgrp.
  
      The man page for "stat(2)" discusses this.
  
***************
*** 638,644 ****
  
  	find /path -print | xargs command
      
!     which would result in
  
  	command file1 file2 file3 file4 dir1/file1 dir1/file2
      
--- 639,645 ----
  
  	find /path -print | xargs command
      
!     which would result in one or more executions of
  
  	command file1 file2 file3 file4 dir1/file1 dir1/file2
      
***************
*** 767,773 ****
  	     for the $IDENT card.  Not elegant."
  
      nroff = "New ROFF"
!     troff = "Typesetter ROFF"
  	
  	These are descendants of "roff", which was a re-implementation
  	of the Multics "runoff" program (a program that you'd use to
--- 768,774 ----
  	     for the $IDENT card.  Not elegant."
  
      nroff = "New ROFF"
!     troff = "Typesetter new ROFF"
  	
  	These are descendants of "roff", which was a re-implementation
  	of the Multics "runoff" program (a program that you'd use to
***************
*** 796,802 ****
  	    be punched literally into the object deck but was represented
  	    by a count somewhere.
  
!     biff = "biff"
  
      	This command, which turns on asynchronous mail notification,
  	was actually named after a dog at Berkeley.
--- 797,803 ----
  	    be punched literally into the object deck but was represented
  	    by a count somewhere.
  
!     biff = "BIFF"
  
      	This command, which turns on asynchronous mail notification,
  	was actually named after a dog at Berkeley.
***************
*** 926,937 ****
  
  22) How can a process detect if it's running in the background?
  
!     In general, you can't.  The fundamental problem is that different
!     shells and different versions of UNIX have different notions of
!     what "foreground" and "background" mean - and on the most common
!     type of system with a better-defined notion of what they mean,
!     programs can be moved arbitrarily between foreground and background!
  
      UNIX systems without job control typically put a process into the
      background by ignoring SIGINT and SIGQUIT and redirecting the standard
      input to "/dev/null"; this is done by the shell.
--- 927,947 ----
  
  22) How can a process detect if it's running in the background?
  
!     First of all: do you want to know if you're running in the background,
!     or if you're running interactively? If you're deciding whether or
!     not you should print prompts and the like, that's probably a better
!     criterion. Check if standard input is a terminal:
  
+ 	    sh: if [ -t 0 ]; then ... fi
+ 	    C: if(isatty(0)) { ... }
+ 
+     In general, you can't tell if you're running in the background.
+     The fundamental problem is that different shells and different
+     versions of UNIX have different notions of what "foreground" and
+     "background" mean - and on the most common type of system with a
+     better-defined notion of what they mean, programs can be moved
+     arbitrarily between foreground and background!
+ 
      UNIX systems without job control typically put a process into the
      background by ignoring SIGINT and SIGQUIT and redirecting the standard
      input to "/dev/null"; this is done by the shell.
***************
*** 944,950 ****
      UNIX systems that support job control, typically do what shells do on
      systems that don't support job control.
  
! 23) How do I pronounce "vi" , or "!", or "/*", or ...?
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
--- 954,990 ----
      UNIX systems that support job control, typically do what shells do on
      systems that don't support job control.
  
! 23) How can an executing program determine its own pathname?
! 
!     Your program can look at argv[0]; if it begins with a "/",
!     it is probably the absolute pathname to your program, otherwise
!     your program can look at every directory named in the environment
!     variable PATH and try to find the first one that contains an
!     executable file whose name matches your program's argv[0]
!     (which by convention is the name of the file being executed).
!     By concatenating that directory and the value of argv[0] you'd
!     probably have the right name.
!     
!     You can't really be sure though, since it is quite legal for one
!     program to exec() another with any value of argv[0] it desires.
!     It is merely a convention that new programs are exec'd with the
!     executable file name in argv[0].
! 
!     For instance, purely a hypothetical example:
! 	
! 	#include <stdio.h>
! 	main()
! 	{
! 	    execl("/usr/games/rogue", "vi Thesis", (char *)NULL);
! 	}
! 
!     The executed program thinks its name (its argv[0] value) is
!     "vi Thesis".   (Certain other programs might also think that
!     the name of the program you're currently running is "vi Thesis",
!     but of course this is just a hypothetical example, don't
!     try it yourself :-)
!     
! 24) How do I pronounce "vi" , or "!", or "/*", or ...?
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
***************
*** 960,968 ****
      pronunciation list that has made the rounds in the past.  This list
      is maintained by Maarten Litmaath, maart@cs.vu.nl .
  
  			The Pronunciation Guide
  			-----------------------
! 			      version 2.1
  
  Names derived from UNIX are marked with *, names derived from C are marked
  with +, names derived from (Net)Hack are marked with & and names deserving
--- 1000,1009 ----
      pronunciation list that has made the rounds in the past.  This list
      is maintained by Maarten Litmaath, maart@cs.vu.nl .
  
+ 
  			The Pronunciation Guide
  			-----------------------
! 			      version 2.2
  
  Names derived from UNIX are marked with *, names derived from C are marked
  with +, names derived from (Net)Hack are marked with & and names deserving
***************
*** 984,990 ****
  #    CROSSHATCH, pound, pound sign, number, number sign, sharp, octothorpe#,
  	hash, (garden) fence, crunch, mesh, hex, flash, grid, pig-pen,
  	tictactoe, scratch (mark), (garden) gate, hak, oof, rake, sink&,
! 	corridor&, unequal#
  
  $    DOLLAR SIGN, dollar, cash, currency symbol, buck, string#, escape#, 
  	ding, big-money, gold&, Sonne#
--- 1025,1031 ----
  #    CROSSHATCH, pound, pound sign, number, number sign, sharp, octothorpe#,
  	hash, (garden) fence, crunch, mesh, hex, flash, grid, pig-pen,
  	tictactoe, scratch (mark), (garden) gate, hak, oof, rake, sink&,
! 	corridor&, unequal#, punch mark
  
  $    DOLLAR SIGN, dollar, cash, currency symbol, buck, string#, escape#, 
  	ding, big-money, gold&, Sonne#
***************
*** 1119,1131 ****
  		Of course the "dollar" sign had to be renamed - it became the
  		"international currency symbol" which looks like a circle with
  		4 rays spreading from it:
  
! 			\ /
! 			 O
! 			/ \
! 
! 		Because it looks like a (small) shining sun it was usually
! 		called "Sonne" (sun).
  & donald duck	from the Danish "Anders And", which means "Donald Duck"
  * splat		from DEC "spider" glyph
  * Nathan Hale	"I have but one asterisk for my country."
--- 1160,1173 ----
  		Of course the "dollar" sign had to be renamed - it became the
  		"international currency symbol" which looks like a circle with
  		4 rays spreading from it:
+ 			  ____
+ 			\/    \/
+ 			/      \
+ 			\      /
+ 			/\____/\
  
! 		Because it looks like a (small) shining sun, in the German
! 		Democratic Republic it was usually called "Sonne" (sun).
  & donald duck	from the Danish "Anders And", which means "Donald Duck"
  * splat		from DEC "spider" glyph
  * Nathan Hale	"I have but one asterisk for my country."
***************
*** 1172,1177 ****
  | broken line	EBCDIC has two vertical bars, one solid and one broken.
  ~ enyay		from the Spanish n-tilde
  () nil		LISP
  -- 
  Steve Hayman    Workstation Manager    Computer Science Department   Indiana U.
! sahayman@iuvax.cs.indiana.edu     iuvax!sahayman                 (812) 855-6984
--- 1214,1221 ----
  | broken line	EBCDIC has two vertical bars, one solid and one broken.
  ~ enyay		from the Spanish n-tilde
  () nil		LISP
+ 
  -- 
  Steve Hayman    Workstation Manager    Computer Science Department   Indiana U.
! sahayman@iuvax.cs.indiana.edu                                    (812) 855-6984
! NeXT Mail: sahayman@spurge.bloomington.in.us

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (09/06/90)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions and comp.unix.wizards.  You can also ftp
the most recent version from iuvax.cs.indiana.edu (129.79.254.192),
where it's "pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".


[[Author's Note:  Sorry for the delay in getting these out.  I haven't
  had time to make any significant changes to these postings this month.
  A lot of part 1 needs to be updated to reflect the new comp.unix.*
  subgroups - I'll get that into next month's version ...sah ]]

*** /tmp/,RCSt1a03691	Wed Sep  5 22:12:40 1990
--- part1	Wed Sep  5 22:12:08 1990
***************
*** 1,6 ****
  Subject: Welcome to comp.unix.questions and comp.unix.wizards [Monthly posting]
  
! [Last changed: $Date: 90/08/01 23:43:59 $ by $Author: sahayman $]
  
  Comp.unix.questions and comp.unix.wizards are two of the most popular
  and highest volume newsgroups on Usenet.  This article is a monthly
--- 1,12 ----
  Subject: Welcome to comp.unix.questions and comp.unix.wizards [Monthly posting]
  
! [Last changed: $Date: 90/09/05 22:12:04 $ by $Author: sahayman $]
! 
! NOTE - much of this information needs to be changed since a number
! of new comp.unix subgroups have been created.  I haven't had time to
! make the necessary updates yet.  Take much of this posting with a 
! grain of salt at the moment.
!    ... steve hayman, sept. 5 1990
  
  Comp.unix.questions and comp.unix.wizards are two of the most popular
  and highest volume newsgroups on Usenet.  This article is a monthly
*** /tmp/,RCSt1a03704	Wed Sep  5 22:12:44 1990
--- part2	Wed Sep  5 22:12:16 1990
***************
*** 1,6 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/08/01 23:44:07 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
--- 1,6 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/09/05 22:12:09 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
***************
*** 997,1004 ****
      dialects and accents.  
  
      Since this topic keeps coming up on the net, here is a comprehensive
!     pronunciation list that has made the rounds in the past.  This list
!     is maintained by Maarten Litmaath, maart@cs.vu.nl .
  
  
  			The Pronunciation Guide
--- 997,1005 ----
      dialects and accents.  
  
      Since this topic keeps coming up on the net, here is a comprehensive
!     pronunciation list that has made the rounds in the past.  Send updates
!     to Steve Hayman, sahayman@cs.indiana.edu.  Special thanks to
!     Maarten Litmaath for his work in maintaining this list in the past.
  
  
  			The Pronunciation Guide

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (10/02/90)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions and comp.unix.wizards.  You can also ftp
the most recent version from iuvax.cs.indiana.edu (129.79.254.192),
where it's "pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".

*** /tmp/,RCSt1a08685	Mon Oct  1 14:37:14 1990
--- part1	Mon Oct  1 14:36:42 1990
***************
*** 1,12 ****
  Subject: Welcome to comp.unix.questions and comp.unix.wizards [Monthly posting]
  
! [Last changed: $Date: 90/09/05 22:12:04 $ by $Author: sahayman $]
  
! NOTE - much of this information needs to be changed since a number
! of new comp.unix subgroups have been created.  I haven't had time to
! make the necessary updates yet.  Take much of this posting with a 
! grain of salt at the moment.
!    ... steve hayman, sept. 5 1990
  
  Comp.unix.questions and comp.unix.wizards are two of the most popular
  and highest volume newsgroups on Usenet.  This article is a monthly
--- 1,13 ----
  Subject: Welcome to comp.unix.questions and comp.unix.wizards [Monthly posting]
  
! [Last changed: $Date: 90/10/01 14:36:34 $ by $Author: sahayman $]
  
! [NOTE - I'm waiting for the fuss over comp.unix.{wizards,internals,esoterica}
!  to settle down.  Until that happens, I'm going to continue to post these
!  two documents to "comp.unix.questions" and "comp.unix.wizards"; you may be
!  reading this in "comp.unix.internals" if someone upstream from you
!  is aliasing ".wizards" to ".internals".    ...Steve Hayman, Oct. 1/1990 ]
! 
  
  Comp.unix.questions and comp.unix.wizards are two of the most popular
  and highest volume newsgroups on Usenet.  This article is a monthly
*** /tmp/,RCSt1a08724	Mon Oct  1 14:37:21 1990
--- part2	Mon Oct  1 14:37:04 1990
***************
*** 1,6 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/09/05 22:12:09 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
--- 1,6 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/10/01 14:36:47 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions and comp.unix.wizards.  Please don't
***************
*** 43,49 ****
  	21) How do I "undelete" a file?
  	22) How can a process detect if it's running in the background?
  	23) How can an executing program determine its own pathname?
! 	24) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
--- 43,52 ----
  	21) How do I "undelete" a file?
  	22) How can a process detect if it's running in the background?
  	23) How can an executing program determine its own pathname?
! 	24) How do I tell inside .cshrc if I'm a login shell?
! 	25) Why doesn't redirecting a loop work as intended?  (Bourne shell)
! 	26) How do I use popen() to open a process for reading AND writing?
! 	27) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
***************
*** 397,406 ****
  
  	ls -d *.foo | sed -e 's/.*/mv & &/' -e 's/foo$/bar/' | sh
  
!     A program called "ren" that does this job nicely was posted
!     to comp.sources.unix some time ago.  It lets you use
  
! 	ren '*.foo' '#1.bar'
  
      Shell loops like the above can also be used to translate
      file names from upper to lower case or vice versa.  You could use
--- 400,410 ----
  
  	ls -d *.foo | sed -e 's/.*/mv & &/' -e 's/foo$/bar/' | sh
  
!     A program by Vladimir Lanin called "mmv" that does this job nicely
!     was posted to comp.sources.unix (Volume 21, issues 87 and 88) in
!     April 1990.  It lets you use
  
! 	mmv '*.foo' '=1.bar'
  
      Shell loops like the above can also be used to translate
      file names from upper to lower case or vice versa.  You could use
***************
*** 414,420 ****
--- 418,431 ----
  	    for f in *; do
  		mv $f `echo $f | tr '[A-Z]' '[a-z]'`
  	    done
+ 	Korn Shell:
+ 	    typeset -l l
+ 	    for f in *; do
+ 		l=f
+ 		mv $f $l
+ 	    done
  
+ 
      If you wanted to be really thorough and handle files with
      `funny' names (embedded blanks or whatever) you'd need to use
      
***************
*** 984,990 ****
      but of course this is just a hypothetical example, don't
      try it yourself :-)
      
! 24) How do I pronounce "vi" , or "!", or "/*", or ...?
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
--- 995,1090 ----
      but of course this is just a hypothetical example, don't
      try it yourself :-)
      
! 24) How do I tell inside .cshrc if I'm a login shell?
! 
!     Here's one way, courtesy of Maarten Litmaath:
! 
!     # .cshrc
! 
!     if (! $?CSHLEVEL) then
!             setenv      CSHLEVEL        0
!             set home = ~username        # just to be sure
!             source ~/.env               # environment stuff we always want
!     else
!             set tmp = $CSHLEVEL
!             @ tmp++
!             setenv      CSHLEVEL        $tmp
!     endif
! 
!     # exit from .cshrc if not interactive, e.g. under rsh (BSD)
!     if (! $?prompt) exit
! 
!     # aliases
!     # set variables
! 
!     ----------------------------------------
! 
!     # .env
! 
!     # umask
!     # setenv variables
! 
!     ----------------------------------------
! 
!     # .login
! 
!     # terminal setup
!     # startup favourite window environment
! 
! 25) Why doesn't redirecting a loop work as intended?  (Bourne shell)
! 
!     Take the following example:
! 
! 	foo=bar
! 
! 	while read line
! 	do
! 		# do something with $line
! 		foo=bletch
! 	done < /etc/passwd
! 
! 	echo "foo is now: $foo"
! 
!     Despite the assignment ``foo=bletch'' this will print ``foo is now: bar''
!     in many implementations of the Bourne shell.  Why?
!     Because of the following, often undocumented, feature of historic
!     Bourne shells: redirecting a control structure (such as a loop, or an
!     ``if'' statement) causes a subshell to be created, in which the structure
!     is executed; variables set in that subshell (like the ``foo=bletch''
!     assignment) don't affect the current shell, of course.
! 
!     The POSIX 1003.2 Shell and Tools Interface standardization committee
!     forbids the behaviour described above, i.e. in P1003.2 conformant
!     Bourne shells the example will print ``foo is now: bletch''.
! 
!     Take the next example:
! 
! 	foo=bar
! 
! 	echo bletch | read foo
! 
! 	echo "foo is now: $foo"
! 
!     This will print ``foo is now: bar'' in many implementations,
!     ``foo is now: bletch'' in some others.  Why?
!     Generally each part of a pipeline is run in a different subshell;
!     in some implementations though, the last command in the pipeline is
!     made an exception: if it is a builtin command like ``read'', the current
!     shell will execute it, else another subshell is created.
! 
!     Draft 9 of POSIX 1003.2 allows both behaviours; future drafts may
!     explicitly specify only one of them though.
! 
! 26) How do I use popen() to open a process for reading AND writing?
!     
!     The problem with trying to pipe both input and output to an arbitrary
!     slave process is that deadlock can occur, if both processes are waiting
!     for not-yet-generated input at the same time.  Deadlock can be avoided
!     only by having BOTH sides follow a strict deadlock-free protocol, but
!     since that requires cooperation from the processes it is inappropriate
!     for a popen()-like library function.
! 
! 27) How do I pronounce "vi" , or "!", or "/*", or ...?
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
***************
*** 997,1010 ****
      dialects and accents.  
  
      Since this topic keeps coming up on the net, here is a comprehensive
!     pronunciation list that has made the rounds in the past.  Send updates
!     to Steve Hayman, sahayman@cs.indiana.edu.  Special thanks to
!     Maarten Litmaath for his work in maintaining this list in the past.
  
- 
  			The Pronunciation Guide
  			-----------------------
! 			      version 2.2
  
  Names derived from UNIX are marked with *, names derived from C are marked
  with +, names derived from (Net)Hack are marked with & and names deserving
--- 1097,1109 ----
      dialects and accents.  
  
      Since this topic keeps coming up on the net, here is a comprehensive
!     pronunciation list that has made the rounds.  Send updates to
!     Steve Hayman, sahayman@cs.indiana.edu.  Special thanks to Maarten
!     Litmaath for his work in maintaining this list in the past.
  
  			The Pronunciation Guide
  			-----------------------
! 			      version 2.3
  
  Names derived from UNIX are marked with *, names derived from C are marked
  with +, names derived from (Net)Hack are marked with & and names deserving
***************
*** 1076,1086 ****
  =    EQUAL SIGN, equal(s), gets, becomes, quadrathorpe#, half-mesh, ring&
  
  ?    QUESTION MARK, question, query, whatmark, what, wildchar*, huh, ques,
! 	kwes, quiz, quark, hook, scroll&
  
! @    AT SIGN, at, each, vortex, whirl, whirlpool, cyclone, snail, ape, cat,
! 	snable-a#, trunk-a#, rose, cabbage, Mercantile symbol, strudel#,
! 	fetch#, shopkeeper&, human&, commercial-at
  
  []   BRACKETS, square brackets, U-turns, edged parentheses
  [    LEFT BRACKET,  bracket,   bra, (left) square (brack[et]),   opensquare,
--- 1175,1185 ----
  =    EQUAL SIGN, equal(s), gets, becomes, quadrathorpe#, half-mesh, ring&
  
  ?    QUESTION MARK, question, query, whatmark, what, wildchar*, huh, ques,
! 	kwes, quiz, quark, hook, scroll&, interrogation point
  
! @    AT SIGN, at, each, vortex, whirl, whirlpool, cyclone, snail, ape (tail),
! 	cat, snable-a#, trunk-a#, rose, cabbage, Mercantile symbol, strudel#,
! 	fetch#, shopkeeper&, human&, commercial-at, monkey (tail)
  
  []   BRACKETS, square brackets, U-turns, edged parentheses
  [    LEFT BRACKET,  bracket,   bra, (left) square (brack[et]),   opensquare,
***************
*** 1097,1103 ****
  	sharkfin, and#, xor+, wok, trap&, pointer#, pipe*, upper-than#
  
  _    UNDERSCORE, underline, underbar, under, score, backarrow, flatworm, blank,
! 	chain&, gets#, dash#
  
  `    GRAVE, (grave/acute) accent, backquote, left/open quote, backprime, 
  	unapostrophe, backspark, birk, blugle, backtick, push, backglitch,
--- 1196,1202 ----
  	sharkfin, and#, xor+, wok, trap&, pointer#, pipe*, upper-than#
  
  _    UNDERSCORE, underline, underbar, under, score, backarrow, flatworm, blank,
! 	chain&, gets#, dash#, sneak
  
  `    GRAVE, (grave/acute) accent, backquote, left/open quote, backprime, 
  	unapostrophe, backspark, birk, blugle, backtick, push, backglitch,
***************
*** 1215,1221 ****
  | broken line	EBCDIC has two vertical bars, one solid and one broken.
  ~ enyay		from the Spanish n-tilde
  () nil		LISP
- 
  -- 
  Steve Hayman    Workstation Manager    Computer Science Department   Indiana U.
  sahayman@iuvax.cs.indiana.edu                                    (812) 855-6984
--- 1314,1319 ----

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (11/02/90)

Note:

    I have decided to post the Frequently Asked Questions list only
    to the newsgroup "comp.unix.questions", and not, as I was earlier
    wondering about, to all non-platform-specific Unix groups.
    The list is, after all, a list of questions and really does
    belong in comp.unix.questions.  Also, other various comp.unix.*
    groups may develop their own FAQ list as time goes by.  I hope this
    list will still be a good reference for readers of all the
    comp.unix.* groups.

    ..Steve


Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions.  You can also ftp the most recent version from
iuvax.cs.indiana.edu (129.79.254.192), where it's
"pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".

*** /tmp/,RCSt1a00944	Fri Nov  2 09:57:06 1990
--- part1	Fri Nov  2 09:52:43 1990
***************
*** 1,19 ****
! Subject: Welcome to comp.unix.questions and comp.unix.wizards [Monthly posting]
  
! [Last changed: $Date: 90/10/01 14:36:34 $ by $Author: sahayman $]
  
! [NOTE - I'm waiting for the fuss over comp.unix.{wizards,internals,esoterica}
!  to settle down.  Until that happens, I'm going to continue to post these
!  two documents to "comp.unix.questions" and "comp.unix.wizards"; you may be
!  reading this in "comp.unix.internals" if someone upstream from you
!  is aliasing ".wizards" to ".internals".    ...Steve Hayman, Oct. 1/1990 ]
! 
! 
! Comp.unix.questions and comp.unix.wizards are two of the most popular
! and highest volume newsgroups on Usenet.  This article is a monthly
! attempt to remind potential posters about what is appropriate for each
! of the two newsgroups.  If you would like to make any suggestions about
! the content of this article, please contact its maintainer at
  sahayman@iuvax.cs.indiana.edu  or  iuvax!sahayman .
  
  A companion article includes the answers to some Frequently
--- 1,13 ----
! Subject: Welcome to comp.unix.questions [Monthly posting]
  
! [Last changed: $Date: 90/11/02 09:52:30 $ by $Author: sahayman $]
  
! 
! Comp.unix.questions is one of the most popular and highest volume
! newsgroups on Usenet.  This article is a monthly attempt to remind
! potential posters about what is appropriate for this newsgroup.
! If you would like to make any suggestions about the
! content of this article, please contact its maintainer at
  sahayman@iuvax.cs.indiana.edu  or  iuvax!sahayman .
  
  A companion article includes the answers to some Frequently
***************
*** 20,25 ****
--- 14,20 ----
  Asked Questions.  You may save yourself a lot of time by reading
  that article before posting a question to the net.
  
+ 
  If you have not already read the overall Usenet introductory material
  posted to "news.announce.newusers", please do.  Much of this article
  overlaps with the common sense guidelines posted there.
***************
*** 54,64 ****
        such books available, and you will save yourself a lot
        of trouble by having one handy and consulting it frequently.
  
! Please remember that comp.unix.questions and comp.unix.wizards are
! read by over 50,000 people around the world, and that posting a question
! to either of these groups will cost a lot of time and money by the
! time your article is distributed to Japan, Australia, Western Europe,
! Israel, and all corners of North America.
  
  Also, some people receive these newsgroups as part of a mailing list
  rather than a newsgroup.  If you're one of these people, please don't
--- 49,58 ----
        such books available, and you will save yourself a lot
        of trouble by having one handy and consulting it frequently.
  
! Please remember that the comp.unix.* newsgroups are read by over 50,000
! people around the world, and that posting a question to this group will
! cost a lot of time and money by the time your article is distributed to
! Japan, Australia, Western Europe, Israel, and all corners of North America.
  
  Also, some people receive these newsgroups as part of a mailing list
  rather than a newsgroup.  If you're one of these people, please don't
***************
*** 71,101 ****
  
  
  
!     Should I Post to "comp.unix.questions" or "comp.unix.wizards" ?
  
! Comp.unix.wizards is intended for advanced discussion of Unix features - the
! sort of topics the average user never thinks about.  Simple questions
! about using normal commands should never go there.  Unfortunately, it's
! often hard to tell whether your question is simple until you know
! what the answer is.  A good rule of thumb is -
! 
!     Don't post to comp.unix.wizards unless *you* *yourself* are
!     a Unix wizard.
! 
! Don't post to comp.unix.wizards just because you want to get the
! attention of a unix wizard.  Many unix wizards read comp.unix.questions
! also and will be happy to help you out if they see your question there.
! 
! Some other newsgroups may be more appropriate than either of
! comp.unix.questions or comp.unix.wizards.  These include:
! 
!     comp.lang.c		General discussion of the C language
! 			(comp.lang.c has its own "Frequently Asked Questions"
! 			 list - be sure to check it out before posting a
! 			 question to that group.)
!     comp.std.c		Discussion of the ANSI/ISO C standard
!     comp.std.unix	Discussion of Unix standards and particularly
! 			the IEEE 1003 POSIX standard.
  
  	      What Information Should I Include?
  
--- 65,108 ----
  
  
  
!                To Which Newsgroup Should I Post My Question?
! 
  
! The choice of newsgroup is harder than it used to be.  In the old days,
! you just had to choose between "comp.unix.questions" and
! "comp.unix.wizards".  The latter group has been subdivided into several
! specific groups.   Choose one of the following groups carefully.  If
! you aren't sure where your question belongs or if your question is not
! specific to some particular version of Unix, try "comp.unix.questions".
! Many knowledgeable Unix wizards read that group and will be able
! to help you.
! 
! Here are the capsule descriptions of various groups you might consider
! (extracted from a monthly posting to "news.announce.newusers")
! 
! comp.unix.questions     UNIX neophytes group.
! 			If your question isn't a really good match for one of
! 			the groups below, post it here.
! 
! comp.lang.c             Discussion about C.
! 
! comp.sources.unix       Postings of complete, UNIX-oriented sources. (Moderated)
! comp.std.unix           Discussion for the P1003 committee on UNIX. (Moderated)
! comp.unix               Discussion of UNIX* features and bugs. (Moderated)
! comp.unix.admin         Administering a Unix-based system.
! comp.unix.aix           IBM's version of UNIX.
! comp.unix.aux           The version of UNIX for Apple Macintosh II computers.
! comp.unix.internals     Discussions on hacking UNIX internals.
! comp.unix.large         UNIX on mainframes and in large networks.
! comp.unix.misc          Various topics that don't fit other groups.
! comp.unix.msdos         MS-DOS running under UNIX by whatever means.
! comp.unix.programmer    Q&A for people programming under Unix.
! comp.unix.shell         Using and programming the Unix shell.
! comp.unix.sysv286       UNIX System V (not XENIX) on the '286.
! comp.unix.sysv386       Versions of Unix (not Xenix) on Intel 80386-based boxes.
! comp.unix.ultrix        Discussions about DEC's Ultrix.
! comp.unix.xenix.misc    General discussions regarding XENIX (except SCO).
! comp.unix.xenix.sco     XENIX versions from the Santa Cruz Operation.
  
  	      What Information Should I Include?
  
*** /tmp/,RCSt1a00965	Fri Nov  2 09:57:13 1990
--- part2	Fri Nov  2 09:54:34 1990
***************
*** 1,15 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/10/01 14:36:47 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
! often seen in comp.unix.questions and comp.unix.wizards.  Please don't
! ask these questions again, they've been answered plenty of times
! already - and please don't flame someone just because they may not have
! read this particular posting.  Thank you.
  
- This article includes answers to:
  
  
  	1)  How do I remove a file whose name begins with a "-" ?
  	2)  How do I remove a file with funny characters in the filename ?
--- 1,15 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/11/02 09:52:46 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
! often seen in comp.unix.questions.  Please don't ask these questions
! again, they've been answered plenty of times already - and please don't
! flame someone just because they may not have read this particular
! posting.  Thank you.
  
  
+ This article includes answers to:
  
  	1)  How do I remove a file whose name begins with a "-" ?
  	2)  How do I remove a file with funny characters in the filename ?
***************
*** 421,427 ****
  	Korn Shell:
  	    typeset -l l
  	    for f in *; do
! 		l=f
  		mv $f $l
  	    done
  
--- 421,427 ----
  	Korn Shell:
  	    typeset -l l
  	    for f in *; do
! 		l="$f"
  		mv $f $l
  	    done
  
***************
*** 835,840 ****
--- 835,844 ----
      There should be no difference in content between the
      mailing list and the newsgroup.   
  
+ 	[Note: The newsgroup "comp.unix.questions" was recently
+ 	deleted, but the "Unix-Wizards" mailing list still exists.
+ 	I'm not really sure how this is all going to sort itself out.]
+ 
      To get on or off either of these lists, send mail to
      Info-Unix-Request@brl.mil or Unix-Wizards-Request@brl.mil .
      Be sure to use the '-Request'.  Don't expect an immediate response.
***************
*** 997,1035 ****
      
  24) How do I tell inside .cshrc if I'm a login shell?
  
!     Here's one way, courtesy of Maarten Litmaath:
  
!     # .cshrc
! 
!     if (! $?CSHLEVEL) then
!             setenv      CSHLEVEL        0
!             set home = ~username        # just to be sure
!             source ~/.env               # environment stuff we always want
!     else
!             set tmp = $CSHLEVEL
!             @ tmp++
!             setenv      CSHLEVEL        $tmp
!     endif
! 
!     # exit from .cshrc if not interactive, e.g. under rsh (BSD)
!     if (! $?prompt) exit
! 
!     # aliases
!     # set variables
! 
!     ----------------------------------------
! 
!     # .env
! 
!     # umask
!     # setenv variables
! 
!     ----------------------------------------
! 
!     # .login
  
!     # terminal setup
!     # startup favourite window environment
  
  25) Why doesn't redirecting a loop work as intended?  (Bourne shell)
  
--- 1001,1047 ----
      
  24) How do I tell inside .cshrc if I'm a login shell?
  
!     When people ask this, they usually mean either
  
! 	How can I tell if it's an interactive shell?
!     or
! 	How can I tell if it's a top-level shell?
! 	
!     You could perhaps determine if your shell truly is a login shell
!     (i.e. is going to source ".login" after it is done with ".cshrc")
!     by fooling around with "ps" and "$$"; if you're really interested
!     in the other two questions, here's one way you can organize
!     your .cshrc to find out.
! 
! 
! 	if (! $?CSHLEVEL) then
! 		#
! 		# This is a "top-level" shell,
! 		# perhaps a login shell, perhaps a shell started up by
! 		# 'rsh machine some-command'
! 		# This is where we should set PATH and anything else we
! 		# want to apply to every one of our shells.
! 		#
! 		setenv      CSHLEVEL        0
! 		set home = ~username        # just to be sure
! 		source ~/.env               # environment stuff we always want
! 	else
! 		# 
! 		# This shell is a child of one of our other shells so
! 		# we don't need to set all the environment variables again.
! 		#
! 		set tmp = $CSHLEVEL
! 		@ tmp++
! 		setenv      CSHLEVEL        $tmp
! 	endif
! 
! 	# Exit from .cshrc if not interactive, e.g. under rsh 
! 	if (! $?prompt) exit
! 
! 	# Here we could set the prompt or aliases that would be useful
! 	# for interactive shells only.
  
! 	source ~/.aliases
  
  25) Why doesn't redirecting a loop work as intended?  (Bourne shell)
  
***************
*** 1057,1064 ****
      forbids the behaviour described above, i.e. in P1003.2 conformant
      Bourne shells the example will print ``foo is now: bletch''.
  
!     Take the next example:
  
  	foo=bar
  
  	echo bletch | read foo
--- 1069,1099 ----
      forbids the behaviour described above, i.e. in P1003.2 conformant
      Bourne shells the example will print ``foo is now: bletch''.
  
!     In historic (and P1003.2 conformant) implementations you can use the
!     following `trick' to get around the redirection problem:
! 
! 	foo=bar
! 
! 	# make file descriptor 9 a duplicate of file descriptor 0 (stdin);
! 	# then connect stdin to /etc/passwd; the original stdin is now
! 	# `remembered' in file descriptor 9; see dup(2) and sh(1)
! 	exec 9<&0 < /etc/passwd
! 
! 	while read line
! 	do
! 		# do something with $line
! 		foo=bletch
! 	done
! 
! 	# make stdin a duplicate of file descriptor 9, i.e. reconnect it to
! 	# the original stdin; then close file descriptor 9
! 	exec 0<&9 9<&-
  
+ 	echo "foo is now: $foo"
+ 
+     This should always print ``foo is now: bletch''.
+     Right, take the next example:
+ 
  	foo=bar
  
  	echo bletch | read foo
***************
*** 1072,1078 ****
      made an exception: if it is a builtin command like ``read'', the current
      shell will execute it, else another subshell is created.
  
!     Draft 9 of POSIX 1003.2 allows both behaviours; future drafts may
      explicitly specify only one of them though.
  
  26) How do I use popen() to open a process for reading AND writing?
--- 1107,1113 ----
      made an exception: if it is a builtin command like ``read'', the current
      shell will execute it, else another subshell is created.
  
!     Draft 10 of POSIX 1003.2 allows both behaviours; future drafts may
      explicitly specify only one of them though.
  
  26) How do I use popen() to open a process for reading AND writing?
***************
*** 1085,1090 ****
--- 1120,1126 ----
      for a popen()-like library function.
  
  27) How do I pronounce "vi" , or "!", or "/*", or ...?
+ 
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
***************
*** 1103,1109 ****
  
  			The Pronunciation Guide
  			-----------------------
! 			      version 2.3
  
  Names derived from UNIX are marked with *, names derived from C are marked
  with +, names derived from (Net)Hack are marked with & and names deserving
--- 1139,1145 ----
  
  			The Pronunciation Guide
  			-----------------------
! 			      version 2.4
  
  Names derived from UNIX are marked with *, names derived from C are marked
  with +, names derived from (Net)Hack are marked with & and names deserving
***************
*** 1165,1176 ****
  
  ;    SEMICOLON, semi, hybrid, giant eel&, go-on#
  
! <>   ANGLE BRACKETS, angles, funnels, brokets, pointy brackets
  <    LESS THAN,    less, read from*, from*,        in*,  comesfrom*, crunch,
! 	sucks, left chevron#, open pointy (brack[et]), bra#, upstairs&, west
  >    GREATER THAN, more, write to*,  into/toward*, out*, gazinta*,   zap,
  	blows, right chevron#, closing pointy (brack[et]), ket#, downstairs&,
! 	east
  
  =    EQUAL SIGN, equal(s), gets, becomes, quadrathorpe#, half-mesh, ring&
  
--- 1201,1213 ----
  
  ;    SEMICOLON, semi, hybrid, giant eel&, go-on#
  
! <>   ANGLE BRACKETS, angles, funnels, brokets, pointy brackets, widgets
  <    LESS THAN,    less, read from*, from*,        in*,  comesfrom*, crunch,
! 	sucks, left chevron#, open pointy (brack[et]), bra#, upstairs&, west,
! 	(left|open) widget
  >    GREATER THAN, more, write to*,  into/toward*, out*, gazinta*,   zap,
  	blows, right chevron#, closing pointy (brack[et]), ket#, downstairs&,
! 	east, (right|close) widget
  
  =    EQUAL SIGN, equal(s), gets, becomes, quadrathorpe#, half-mesh, ring&
  
***************
*** 1314,1319 ****
--- 1351,1357 ----
  | broken line	EBCDIC has two vertical bars, one solid and one broken.
  ~ enyay		from the Spanish n-tilde
  () nil		LISP
+ 
  -- 
  Steve Hayman    Workstation Manager    Computer Science Department   Indiana U.
  sahayman@iuvax.cs.indiana.edu                                    (812) 855-6984

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (12/03/90)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions.  You can also ftp the most recent version from
iuvax.cs.indiana.edu (129.79.254.192), where it's
"pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".
(IUVax also runs a mail server, for those of you unable to ftp.
 Send the line "HELP" to "mailserv@iuvax.cs.indiana.edu" to get started.)

*** /tmp/,RCSt1a05989	Sun Dec  2 23:46:44 1990
--- part1	Sun Dec  2 23:46:31 1990
***************
*** 1,6 ****
  Subject: Welcome to comp.unix.questions [Monthly posting]
  
! [Last changed: $Date: 90/11/02 09:52:30 $ by $Author: sahayman $]
  
  
  Comp.unix.questions is one of the most popular and highest volume
--- 1,6 ----
  Subject: Welcome to comp.unix.questions [Monthly posting]
  
! [Last changed: $Date: 90/12/02 23:46:27 $ by $Author: sahayman $]
  
  
  Comp.unix.questions is one of the most popular and highest volume
***************
*** 48,58 ****
      o Find a good introductory book on Unix.  There are plenty of
        such books available, and you will save yourself a lot
        of trouble by having one handy and consulting it frequently.
! 
  Please remember that the comp.unix.* newsgroups are read by over 50,000
  people around the world, and that posting a question to this group will
  cost a lot of time and money by the time your article is distributed to
! Japan, Australia, Western Europe, Israel, and all corners of North America.
  
  Also, some people receive these newsgroups as part of a mailing list
  rather than a newsgroup.  If you're one of these people, please don't
--- 48,61 ----
      o Find a good introductory book on Unix.  There are plenty of
        such books available, and you will save yourself a lot
        of trouble by having one handy and consulting it frequently.
!       (Question 28 in part 2 of this list will let you know where
!        you can find a list of good Unix and C books.)
!       
  Please remember that the comp.unix.* newsgroups are read by over 50,000
  people around the world, and that posting a question to this group will
  cost a lot of time and money by the time your article is distributed to
! Japan, Australia, Europe (including the Soviet Union), Africa, Israel,
! and all corners of North America.
  
  Also, some people receive these newsgroups as part of a mailing list
  rather than a newsgroup.  If you're one of these people, please don't
*** /tmp/,RCSt1a06005	Sun Dec  2 23:46:49 1990
--- part2	Sun Dec  2 23:46:38 1990
***************
*** 1,12 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/11/02 09:52:46 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
! often seen in comp.unix.questions and comp.unix.wizards.  Please don't
! ask these questions again, they've been answered plenty of times
! already - and please don't flame someone just because they may not have
! read this particular posting.  Thank you.
  
  
  This article includes answers to:
--- 1,12 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/12/02 23:46:32 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
! often seen in comp.unix.questions.  Please don't ask these questions
! again, they've been answered plenty of times already - and please don't
! flame someone just because they may not have read this particular
! posting.  Thank you.
  
  
  This article includes answers to:
***************
*** 30,36 ****
  	      until the remote command has completed?
  	13) How do I truncate a file?
  	14) How do I {set an environment variable, change directory} inside a
! 	      shell script and have that change affect my current shell?
  	15) Why doesn't find's "{}" symbol do what I want?
  	16) How do I redirect stdout and stderr separately in csh?
  	17) How do I set the permissions on a symbolic link?
--- 30,37 ----
  	      until the remote command has completed?
  	13) How do I truncate a file?
  	14) How do I {set an environment variable, change directory} inside a
! 	      program or shell script and have that change affect my
! 	      current shell?
  	15) Why doesn't find's "{}" symbol do what I want?
  	16) How do I redirect stdout and stderr separately in csh?
  	17) How do I set the permissions on a symbolic link?
***************
*** 46,52 ****
  	24) How do I tell inside .cshrc if I'm a login shell?
  	25) Why doesn't redirecting a loop work as intended?  (Bourne shell)
  	26) How do I use popen() to open a process for reading AND writing?
! 	27) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
--- 47,58 ----
  	24) How do I tell inside .cshrc if I'm a login shell?
  	25) Why doesn't redirecting a loop work as intended?  (Bourne shell)
  	26) How do I use popen() to open a process for reading AND writing?
! 	27) How do I run 'passwd", 'ftp', 'telnet', 'tip' and other interactive
! 	      programs from a shell script or in the background?
! 	28) How do I sleep() in a C program for less than one second?
! 	29) How can I get setuid shell scripts to work?
! 	30) What are some useful Unix or C books?
! 	31) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
***************
*** 235,240 ****
--- 241,257 ----
  	so you can do
  
  	    set prompt='%~ '
+ 
+     BASH (FSF's "Bourne Again SHell")
+ 	
+ 	\w in $PS1 gives the full pathname of the current directory,
+ 	with ~ expansion for $HOME;  \W gives the basename of
+ 	the current directory.  So, in addition to the above sh and
+ 	ksh solutions, you could use
+ 
+ 	    PS1='\w $ '	
+ 	or
+ 	    PS1='\W $ '
  	    
  5)  How do I read characters from a terminal without requiring the user
      to hit RETURN?
***************
*** 547,559 ****
      truncation to length zero with creat() or open(..., O_TRUNC).
  
  14) How do I {set an environment variable, change directory} inside a
! 	shell script and have that change affect my current shell?
  
!     You can't, unless you use a special command to run the script in
!     the context of the current shell rather than in a child program.
!     The process environment (including environment variables and
!     current directory) is inherited by child programs but cannot be
!     passed back to parent programs.
  
      For instance, if you have a C shell script named "myscript":
  
--- 564,586 ----
      truncation to length zero with creat() or open(..., O_TRUNC).
  
  14) How do I {set an environment variable, change directory} inside a
!       program or shell script and have that change affect my
!       current shell?
! 
!     In general, you can't, at least not without making special
!     arrangements.  When a child process is created, it inherits a copy
!     of its parent's variables (and current directory).  The child can
!     change these values all it wants but the changes won't affect the
!     parent shell, since the child is changing a copy of the 
!     original data.
! 
!     Some special arrangements are possible.  Your child process could
!     write out the changed variables, if the parent was prepared to read
!     the output and interpret it as commands to set its own variables.
  
!     Also, shells can arrange to run other shell scripts in the context
!     of the current shell, rather than in a child process, so that
!     changes will affect the original shell.
  
      For instance, if you have a C shell script named "myscript":
  
***************
*** 835,840 ****
--- 862,871 ----
      There should be no difference in content between the
      mailing list and the newsgroup.   
  
+ 	[Note: The newsgroup "comp.unix.wizards" was recently
+ 	deleted, but the "Unix-Wizards" mailing list still exists.
+ 	I'm not really sure how this is all going to sort itself out.]
+ 
      To get on or off either of these lists, send mail to
      Info-Unix-Request@brl.mil or Unix-Wizards-Request@brl.mil .
      Be sure to use the '-Request'.  Don't expect an immediate response.
***************
*** 1115,1121 ****
      since that requires cooperation from the processes it is inappropriate
      for a popen()-like library function.
  
! 27) How do I pronounce "vi" , or "!", or "/*", or ...?
  
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
--- 1146,1370 ----
      since that requires cooperation from the processes it is inappropriate
      for a popen()-like library function.
  
! 27) How do I run 'passwd", 'ftp', 'telnet', 'tip' and other interactive
!     programs from a shell script or in the background?
! 
!     The shell itself cannot interact with interactive tty-based programs
!     like these. Fortunately some programs have been written to manage
!     the connection to a pseudo-tty so that you can run these sorts
!     of programs in a script.
!     
!     'expect' is a one such program, which you can ftp pub/expect.shar.Z
!     from durer.cme.nist.gov.
! 
!     The following expect script is an example of a non-interactive
!     version of passwd(1).
! 
!         # username is passed as 1st arg, password as 2nd
!         set password [index $argv 2]
!         spawn passwd [index $argv 1]
!         expect "*password:"
!         send "$password\r"
!         expect "*password:"
!         send "$password\r"
!         expect eof
! 
!     Another solution is provided by the 'pty' program, which runs a
!     program under a pty session and was posted to comp.sources.unix,
!     volume 23, issue 31.
! 
! 28) How do I sleep() in a C program for less than one second?
! 
!     The first thing you need to be aware of is that all you can specify is a
!     MINIMUM amount of delay; the actual delay will depend on scheduling
!     issues such as system load, and could be arbitrarily large if you're
!     unlucky.
! 
!     There is no standard library function that you can count on in all
!     environments for "napping" (the usual name for short sleeps).  The
!     following code is adapted from Doug Gwyn's System V emulation
!     support for 4BSD and exploits the 4BSD select() system call.  On
!     System V you might be able to use poll() in a similar way.
! 
!     /*
! 	    nap -- support routine for 4.2BSD system call emulations
! 
! 	    last edit:	29-Oct-1984	D A Gwyn
!     */
! 
!     extern int	select();
! 
! 
!     int
!     nap( usec )					/* returns 0 if ok, else -1 */
! 	    long		usec;		/* delay in microseconds */
! 	    {
! 	    static struct			/* `timeval' */
! 		    {
! 		    long	tv_sec;		/* seconds */
! 		    long	tv_usec;	/* microsecs */
! 		    }	delay;		/* _select() timeout */
! 
! 	    delay.tv_sec = usec / 1000000L;
! 	    delay.tv_usec = usec % 1000000L;
! 
! 	    return select( 0, (long *)0, (long *)0, (long *)0, &delay );
! 	    }
! 
! 
! 29) How can I get setuid shell scripts to work?
! 
!     [ This is a long answer, but it's a complicated and frequently-asked
!       question.  Thanks to Maarten Litmaath for this answer, and
!       for the "indir" program mentioned below. ]
! 
!     Let us first assume you are on a UNIX variant (e.g. 4.3BSD or SunOS)
!     that knows about so-called `executable shell scripts'.  Such a script
!     must start with a line like:
! 
! 	#!/bin/sh
! 
!     The script is called `executable' because just like a real (binary)
!     executable it starts with a so-called `magic number' indicating the
!     type of the executable.  In our case this number is `#!' and the OS
!     takes the rest of the first line as the interpreter for the script,
!     possibly followed by 1 initial option like:
! 
! 	#!/bin/sed -f
! 
!     Suppose this script is called `foo', then if you type:
! 
! 	foo arg1 arg2 arg3
! 
!     the OS will rearrange things as though you had typed:
! 
! 	/bin/sed -f foo arg1 arg2 arg3
! 
!     There is one difference though: if the setuid permission bit for
!     `foo' is set, it will be honored in the first form of the command;
!     if you really type the second form, the OS will honor the permission
!     bits of /bin/sed, which is not setuid, of course.
! 
!     ----------
! 
!     OK, but what if my shell script does NOT start with such a `#!' line?
! 
!     Well, if the shell (or anybody else) tries to execute it, the OS will
!     return an error indication, as the file does not start with a valid
!     magic number.  Upon receiving this indication the shell ASSUMES the
!     file to be a shell script and gives it another try:
! 
! 	/bin/sh shell_script arguments
! 
!     But we have already seen that a setuid bit on `shell_script' will NOT
!     be honored in this case!
! 
!     ----------
! 
!     Right, but what about the security risks of setuid shell scripts?
! 
!     Well, suppose the script is called `/etc/setuid_script', starting
!     with:
!     
! 	#!/bin/sh
! 	
!     Now let us see what happens if we issue the following commands:
! 
! 	$ cd /tmp
! 	$ ln /etc/setuid_script -i
! 	$ PATH=.
! 	$ -i
! 
!     We know the last command will be rearranged to:
! 
! 	/bin/sh -i
! 
!     But this command will give us an interactive shell, setuid to the
!     owner of the script!
!     Fortunately this security hole can easily be closed by making the
!     first line:
! 
! 	#!/bin/sh -
! 
!     The `-' signals the end of the option list: the next argument `-i'
!     will be taken as the name of the file to read commands from, just
!     like it should!
! 
!     ---------
! 
!     There are more serious problems though:
! 
! 	$ cd /tmp
! 	$ ln /etc/setuid_script temp
! 	$ nice -20 temp &
! 	$ mv my_script temp
! 
!     The third command will be rearranged to:
! 
! 	nice -20 /bin/sh - temp
! 
!     As this command runs so slowly, the fourth command might be able to
!     replace the original `temp' with `my_script' BEFORE `temp' is opened
!     by the shell!
!     There are 4 ways to fix this security hole:
! 
! 	1)  let the OS start setuid scripts in a different, secure way
! 	    - System V R4 and 4.4BSD use the /dev/fd driver to pass the
! 	    interpreter a file descriptor for the script
! 
! 	2)  let the script be interpreted indirectly, through a frontend
! 	    that makes sure everything is all right before starting the
! 	    real interpreter - if you use the `indir' program from
! 	    comp.sources.unix the setuid script will look like this:
! 
! 		#!/bin/indir -u
! 		#?/bin/sh /etc/setuid_script
! 
! 	3)  make a `binary wrapper': a real executable that is setuid and
! 	    whose only task is to execute the interpreter with the name of
! 	    the script as an argument
! 
! 	4)  make a general `setuid script server' that tries to locate the
! 	    requested `service' in a database of valid scripts and upon
! 	    success will start the right interpreter with the right
! 	    arguments.
! 
!     ---------
! 
!     Now that we have made sure the right file gets interpreted, are there
!     any risks left?
! 
!     Certainly!  For shell scripts you must not forget to set the PATH
!     variable to a safe path explicitly.  Can you figure out why?
!     Also there is the IFS variable that might cause trouble if not set
!     properly.  Other environment variables might turn out to compromise
!     security as well, e.g. SHELL...
!     Furthermore you must make sure the commands in the script do not
!     allow interactive shell escapes!
!     Then there is the umask which may have been set to something
!     strange...
! 
!     Etcetera.  You should realise that a setuid script `inherits' all the
!     bugs and security risks of the commands that it calls!
! 
!     All in all we get the impression setuid shell scripts are quite a
!     risky business!  You may be better off writing a C program instead!
! 
! 30) What are some useful Unix or C books?
! 
!     Mitch Wright (mitch@hq.af.mil) maintains a useful list of Unix and
!     C books, with descriptions and some mini-reviews.  There are currently
!     77 titles on his list.
!     
!     You can obtain a copy of this list by anonymous ftp from
!     iuvax.cs.indiana.edu (129.79.254.192), where it's
!     "pub/Unix-C-Booklist".  If you can't use anonymous ftp, email the
!     line "help" to "mailserv@iuvax.cs.indiana.edu" for instructions on
!     retrieving things via email.
! 
!     Send additions or suggestions to mitch@hq.af.mil .
! 
! 31) How do I pronounce "vi" , or "!", or "/*", or ...?
  
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (01/03/91)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions.  You can also ftp the most recent version from
iuvax.cs.indiana.edu (129.79.254.192), where it's
"pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".
(IUVax also runs a mail server, for those of you unable to ftp.
 Send the line "HELP" to "mailserv@iuvax.cs.indiana.edu" to get started.)

*** /tmp/,RCSt1a16552	Thu Jan  3 14:27:35 1991
--- part2	Thu Jan  3 14:27:26 1991
***************
*** 1,6 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 90/12/02 23:46:32 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions.  Please don't ask these questions
--- 1,6 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 91/01/03 14:27:19 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions.  Please don't ask these questions
***************
*** 47,58 ****
  	24) How do I tell inside .cshrc if I'm a login shell?
  	25) Why doesn't redirecting a loop work as intended?  (Bourne shell)
  	26) How do I use popen() to open a process for reading AND writing?
! 	27) How do I run 'passwd", 'ftp', 'telnet', 'tip' and other interactive
  	      programs from a shell script or in the background?
  	28) How do I sleep() in a C program for less than one second?
  	29) How can I get setuid shell scripts to work?
  	30) What are some useful Unix or C books?
! 	31) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
--- 47,60 ----
  	24) How do I tell inside .cshrc if I'm a login shell?
  	25) Why doesn't redirecting a loop work as intended?  (Bourne shell)
  	26) How do I use popen() to open a process for reading AND writing?
! 	27) How do I run 'passwd', 'ftp', 'telnet', 'tip' and other interactive
  	      programs from a shell script or in the background?
  	28) How do I sleep() in a C program for less than one second?
  	29) How can I get setuid shell scripts to work?
  	30) What are some useful Unix or C books?
! 	31) How do I construct a shell glob-pattern that matches all files
! 	    except "." and ".." ?
! 	32) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
***************
*** 1146,1152 ****
      since that requires cooperation from the processes it is inappropriate
      for a popen()-like library function.
  
! 27) How do I run 'passwd", 'ftp', 'telnet', 'tip' and other interactive
      programs from a shell script or in the background?
  
      The shell itself cannot interact with interactive tty-based programs
--- 1148,1160 ----
      since that requires cooperation from the processes it is inappropriate
      for a popen()-like library function.
  
!     The 'expect' distribution includes a library of functions that a C
!     programmer can call directly.  One of the functions does the
!     equivalent of a popen for both reading and writing.  It uses ptys
!     rather than pipes, and has no deadlock problem.  It's portable to
!     both BSD and SV.  See the next answer for more about 'expect'.
! 
! 27) How do I run 'passwd', 'ftp', 'telnet', 'tip' and other interactive
      programs from a shell script or in the background?
  
      The shell itself cannot interact with interactive tty-based programs
***************
*** 1171,1178 ****
  
      Another solution is provided by the 'pty' program, which runs a
      program under a pty session and was posted to comp.sources.unix,
!     volume 23, issue 31.
  
  28) How do I sleep() in a C program for less than one second?
  
      The first thing you need to be aware of is that all you can specify is a
--- 1179,1209 ----
  
      Another solution is provided by the 'pty' program, which runs a
      program under a pty session and was posted to comp.sources.unix,
!     volume 23, issue 31.  You can also ftp pub/flat/pty-* from
!     stealth.acf.nyu.edu .  A pty-based solution using named pipes
!     to do the same as the above might look like this:
! 
! 	#!/bin/sh
! 	/etc/mknod out.$$ p; exec 2>&1
! 	( exec 4<out.$$; rm -f out.$$
! 	<&4 waitfor 'password:'
! 	    echo "$2"
! 	<&4 waitfor 'password:'
! 	    echo "$2"
! 	<&4 cat >/dev/null
! 	) | ( pty passwd "$1" >out.$$ )
! 
!     Here, 'waitfor' is a simple C program that searches for
!     its argument in the input, character by character.  You can
!     ftp pub/flat/misc-waitfor.c from stealth.acf.nyu.edu .
! 
!     A simpler pty solution (which has the drawback of not 
!     synchronizing properly with the passwd program) is
! 
! 	#!/bin/sh
! 	( sleep 5; echo "$2"; sleep 5; echo "$2") | pty passwd "$1"
  
+ 
  28) How do I sleep() in a C program for less than one second?
  
      The first thing you need to be aware of is that all you can specify is a
***************
*** 1232,1244 ****
  
  	#!/bin/sed -f
  
!     Suppose this script is called `foo', then if you type:
  
  	foo arg1 arg2 arg3
  
      the OS will rearrange things as though you had typed:
  
! 	/bin/sed -f foo arg1 arg2 arg3
  
      There is one difference though: if the setuid permission bit for
      `foo' is set, it will be honored in the first form of the command;
--- 1263,1276 ----
  
  	#!/bin/sed -f
  
!     Suppose this script is called `foo' and is found in /bin,
!     then if you type:
  
  	foo arg1 arg2 arg3
  
      the OS will rearrange things as though you had typed:
  
! 	/bin/sed -f /bin/foo arg1 arg2 arg3
  
      There is one difference though: if the setuid permission bit for
      `foo' is set, it will be honored in the first form of the command;
***************
*** 1247,1253 ****
  
      ----------
  
!     OK, but what if my shell script does NOT start with such a `#!' line?
  
      Well, if the shell (or anybody else) tries to execute it, the OS will
      return an error indication, as the file does not start with a valid
--- 1279,1286 ----
  
      ----------
  
!     OK, but what if my shell script does NOT start with such a `#!' line
!     or my OS does not know about it?
  
      Well, if the shell (or anybody else) tries to execute it, the OS will
      return an error indication, as the file does not start with a valid
***************
*** 1364,1371 ****
  
      Send additions or suggestions to mitch@hq.af.mil .
  
! 31) How do I pronounce "vi" , or "!", or "/*", or ...?
  
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
--- 1397,1436 ----
  
      Send additions or suggestions to mitch@hq.af.mil .
  
! 31) How do I construct a shell glob-pattern that matches all files
!     except "." and ".." ?
! 
!     You'd think this would be easy.
! 
!     *        Matches all files that don't begin with a ".";
! 
!     .*	     Matches all files that do begin with a ".", but
! 	     this includes the special entries "." and "..",
! 	     which often you don't want;
! 
!     .[^.]*   (Newer shells only)  
! 	     Matches all files that begin with a "." and are
! 	     followed by a non-"."; unfortunately this will miss
! 	     "..foo";
! 
!     .??*     Matches files that begin with a "." and which are
! 	     at least 3 characters long.  This neatly avoids
! 	     "." and "..", but also misses ".a" . 
! 
!     
!     Many people are willing to use .??* to match all dotfiles
!     (or * .??* to match all files) even though that pattern doesn't
!     get everything - it has the advantage of being easy to type.
!     If you really do want to be sure, you'll need to employ
!     an external program or two and use backquote substitution.
!     This is pretty good:
! 
!     `ls -a | sed -e '/^\.$/d' -e '/^\.\.$/d'`
  
+     but even it will mess up on files with newlines in their names.
+ 
+ 32) How do I pronounce "vi" , or "!", or "/*", or ...?
+ 
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
***************
*** 1596,1602 ****
  | broken line	EBCDIC has two vertical bars, one solid and one broken.
  ~ enyay		from the Spanish n-tilde
  () nil		LISP
- 
  -- 
  Steve Hayman    Workstation Manager    Computer Science Department   Indiana U.
  sahayman@iuvax.cs.indiana.edu                                    (812) 855-6984
--- 1661,1666 ----

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (02/05/91)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions.  You can also ftp the most recent version from
iuvax.cs.indiana.edu (129.79.254.192), where it's
"pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".
(IUVax also runs a mail server, for those of you unable to ftp.
 Send the line "HELP" to "mailserv@iuvax.cs.indiana.edu" to get started.)

*** /tmp/,RCSt1a23400	Mon Feb  4 12:11:35 1991
--- part2	Mon Feb  4 12:11:25 1991
***************
*** 1,6 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 91/01/03 14:27:19 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions.  Please don't ask these questions
--- 1,6 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 91/02/04 12:11:11 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions.  Please don't ask these questions
***************
*** 54,60 ****
  	30) What are some useful Unix or C books?
  	31) How do I construct a shell glob-pattern that matches all files
  	    except "." and ".." ?
! 	32) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
--- 54,61 ----
  	30) What are some useful Unix or C books?
  	31) How do I construct a shell glob-pattern that matches all files
  	    except "." and ".." ?
! 	32) How do I find the last argument in a Bourne shell script?
! 	33) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
***************
*** 1242,1247 ****
--- 1243,1254 ----
  	    return select( 0, (long *)0, (long *)0, (long *)0, &delay );
  	    }
  
+     Another possibility for nap()ing on System V, and probably other
+     non-BSD Unices is Jon Zeeff's s5nap package, posted to
+     comp.sources.misc, volume 4.  It does require a installing
+     a device driver, but works flawlessly once installed.
+     (Its resolution is limited to the kernel HZ value, since it
+     uses the kernel delay() routine.)
  
  29) How can I get setuid shell scripts to work?
  
***************
*** 1429,1436 ****
  
      but even it will mess up on files with newlines in their names.
  
! 32) How do I pronounce "vi" , or "!", or "/*", or ...?
  
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
--- 1436,1544 ----
  
      but even it will mess up on files with newlines in their names.
  
! 32) How do I find the last argument in a Bourne shell script?
  
+     Answer by:
+ 	Martin Weitzel <@mikros.systemware.de:martin@mwtech.uucp>
+ 	Maarten Litmaath <maart@cs.vu.nl>
+ 
+     If you are sure the number of arguments is at most 9, you can use:
+ 
+ 	eval last=\${$#}
+ 
+     In POSIX-compatible shells it works for ANY number of arguments.
+     The following works always too:
+ 
+ 	for last
+ 	do
+ 		:
+ 	done
+ 
+     This can be generalized as follows:
+ 
+ 	for i
+ 	do
+ 		third_last=$second_last
+ 		second_last=$last
+ 		last=$i
+ 	done
+ 
+     Now suppose you want to REMOVE the last argument from the list,
+     or REVERSE the argument list, or ACCESS the N-th argument directly,
+     whatever N may be.  Here is a basis of how to do it, using only
+     built-in shell constructs, without creating subprocesses:
+ 
+ 	t0= u0= rest='1 2 3 4 5 6 7 8 9' argv=
+ 
+ 	for h in '' $rest
+ 	do
+ 		for t in "$t0" $rest
+ 		do
+ 			for u in $u0 $rest
+ 			do
+ 				case $# in
+ 				0)
+ 					break 3
+ 				esac
+ 				eval argv$h$t$u=\$1
+ 				argv="$argv \"\$argv$h$t$u\""	# (1)
+ 				shift
+ 			done
+ 			u0=0
+ 		done
+ 		t0=0
+ 	done
+ 
+ 	# now restore the arguments
+ 	eval set x "$argv"					# (2)
+ 	shift
+ 
+     This example works for the first 999 arguments.  Enough?
+     Take a good look at the lines marked (1) and (2) and convince yourself
+     that the original arguments are restored indeed, no matter what funny
+     characters they contain!
+ 
+     To find the N-th argument now you can use this:
+ 
+ 	eval argN=\$argv$N
+ 
+     To reverse the arguments the line marked (1) must be changed to:
+ 
+ 	argv="\"\$argv$h$t$u\" $argv"
+ 
+     How to remove the last argument is left as an exercise.
+ 
+     If you allow subprocesses as well, possibly executing nonbuilt-in
+     commands, the `argvN' variables can be set up more easily:
+ 
+ 	N=1
+ 
+ 	for i
+ 	do
+ 		eval argv$N=\$i
+ 		N=`expr $N + 1`
+ 	done
+ 
+     To reverse the arguments there is still a simpler method, that even does
+     not create subprocesses.  This approach can also be taken if you want
+     to delete e.g. the last argument, but in that case you cannot refer
+     directly to the N-th argument anymore, because the `argvN' variables are
+     set up in reverse order:
+ 
+ 	argv=
+ 
+ 	for i
+ 	do
+ 		eval argv$#=\$i
+ 		argv="\"\$argv$#\" $argv"
+ 		shift
+ 	done
+ 
+ 	eval set x "$argv"
+ 	shift
+ 
+ 33) How do I pronounce "vi" , or "!", or "/*", or ...?
+ 
      You can start a very long and pointless discussion by wondering
      about this topic on the net.  Some people say "vye", some say
      "vee-eye" (the vi manual suggests this) and some Roman numerologists
***************
*** 1449,1455 ****
  
  			The Pronunciation Guide
  			-----------------------
! 			      version 2.4
  
  Names derived from UNIX are marked with *, names derived from C are marked
  with +, names derived from (Net)Hack are marked with & and names deserving
--- 1557,1563 ----
  
  			The Pronunciation Guide
  			-----------------------
! 			      version 2.5
  
  Names derived from UNIX are marked with *, names derived from C are marked
  with +, names derived from (Net)Hack are marked with & and names deserving
***************
*** 1547,1553 ****
  
  `    GRAVE, (grave/acute) accent, backquote, left/open quote, backprime, 
  	unapostrophe, backspark, birk, blugle, backtick, push, backglitch,
! 	backping, execute#, boulder&, rock&
  
  {}   BRACES, curly braces, squiggly braces, curly brackets, squiggle brackets,
  	Tuborgs#, ponds, curly chevrons#, squirrly braces, hitchcocks#,
--- 1655,1661 ----
  
  `    GRAVE, (grave/acute) accent, backquote, left/open quote, backprime, 
  	unapostrophe, backspark, birk, blugle, backtick, push, backglitch,
! 	backping, execute#, boulder&, rock&, blip
  
  {}   BRACES, curly braces, squiggly braces, curly brackets, squiggle brackets,
  	Tuborgs#, ponds, curly chevrons#, squirrly braces, hitchcocks#,

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (03/02/91)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions.  You can also ftp the most recent version from
iuvax.cs.indiana.edu (129.79.254.192), where it's
"pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".
(IUVax also runs a mail server, for those of you unable to ftp.
 Send the line "HELP" to "mailserv@iuvax.cs.indiana.edu" to get started.)


The main difference this month is that I've retired the
"Pronunciation Guide", since it's now a part of the
widely-distributed "jargon" file.

*** /tmp/,RCSt1a03079	Fri Mar  1 17:04:56 1991
--- part1	Fri Mar  1 17:02:46 1991
***************
*** 1,6 ****
  Subject: Welcome to comp.unix.questions [Monthly posting]
  
! [Last changed: $Date: 91/02/04 12:11:02 $ by $Author: sahayman $]
  
  
  Comp.unix.questions is one of the most popular and highest volume
--- 1,6 ----
  Subject: Welcome to comp.unix.questions [Monthly posting]
  
! [Last changed: $Date: 91/03/01 17:02:39 $ by $Author: sahayman $]
  
  
  Comp.unix.questions is one of the most popular and highest volume
***************
*** 94,99 ****
--- 94,100 ----
  comp.unix               Discussion of UNIX* features and bugs. (Moderated)
  comp.unix.admin         Administering a Unix-based system.
  comp.unix.aix           IBM's version of UNIX.
+ comp.unix.amiga		Unix on the Commodore Amiga
  comp.unix.aux           The version of UNIX for Apple Macintosh II computers.
  comp.unix.internals     Discussions on hacking UNIX internals.
  comp.unix.large         UNIX on mainframes and in large networks.
*** /tmp/,RCSt1a03126	Fri Mar  1 17:05:17 1991
--- part2	Fri Mar  1 17:04:18 1991
***************
*** 1,6 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 91/02/04 12:11:11 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions.  Please don't ask these questions
--- 1,6 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 91/03/01 17:04:08 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions.  Please don't ask these questions
***************
*** 11,16 ****
--- 11,17 ----
  
  This article includes answers to:
  
+ 	0)  Who helped you put this list together?
  	1)  How do I remove a file whose name begins with a "-" ?
  	2)  How do I remove a file with funny characters in the filename ?
  	3)  How do I get a recursive directory listing?
***************
*** 55,61 ****
  	31) How do I construct a shell glob-pattern that matches all files
  	    except "." and ".." ?
  	32) How do I find the last argument in a Bourne shell script?
! 	33) How do I pronounce "vi" , or "!", or "/*", or ...?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
--- 56,65 ----
  	31) How do I construct a shell glob-pattern that matches all files
  	    except "." and ".." ?
  	32) How do I find the last argument in a Bourne shell script?
! 	33) How can I find out which user or process has a file open or is using
! 	    a particular file system (so that I can unmount it?)
! 	34) What happened to the pronunciation list that used to be
! 	    part of this document?
  
  
      If you're looking for the answer to, say, question 14, and want to skip
***************
*** 75,80 ****
--- 79,91 ----
  corrections for any of these answers, please send them to to
  sahayman@iuvax.cs.indiana.edu or iuvax!sahayman.
  
+ 0)  Who helped you put this list together?
+ 
+ I owe a great deal of thanks to dozens of Usenet readers who submitted
+ questions, answers, corrections and suggestions for this list.  I'd
+ especially like to thank Maarten Litmaath and Guy Harris, who have both
+ made many especially valuable contributions.
+ 
  1)  How do I remove a file whose name begins with a "-" ?
  
      Figure out some way to name the file so that it doesn't
***************
*** 95,102 ****
      
  2)  How do I remove a file with funny characters in the filename ?
  
!     The  classic answers are
  
  	rm -i some*pattern*that*matches*only*the*file*you*want
  
  	which asks you whether you want to remove each file matching
--- 106,118 ----
      
  2)  How do I remove a file with funny characters in the filename ?
  
!     If the 'funny character' is a '/', skip to the last part of
!     this answer.  If the funny character is something else,
!     such as a ' ' or control character or character with
!     the 8th bit set, keep reading.
  
+     The classic answers are
+ 
  	rm -i some*pattern*that*matches*only*the*file*you*want
  
  	which asks you whether you want to remove each file matching
***************
*** 139,144 ****
--- 155,246 ----
      that the filename may contain a funny character sequence that will mess
      up your screen when printed.
  
+ 
+     What if the filename has a '/' in it?
+ 
+     These files really are special cases, and can only be created
+     by buggy kernel code (typically by implementations of NFS
+     that don't filter out illegal characters in file names from
+     remote machines.)  The first thing to do is to try to
+     understand exactly why this problem is so strange.
+ 
+     Recall that Unix directories are simply pairs of
+     filenames and inode numbers.  A directory essentially
+     contains information like this:
+ 
+ 	filename  inode
+ 
+ 	file1	  12345
+ 	file2.c	  12349
+ 	file3     12347
+ 
+     Theoretically, '/' and '\0' are the only two characters that
+     cannot appear in a filename - '/' because it's used to separate
+     directories and files, and '\0' because it terminates a filename.
+ 
+     Unfortunately some implementations of NFS will blithely create
+     filenames with embedded slashes in response to requests from remote
+     machines.  For instance, this could happen when someone on a Mac or
+     other non-Unix machine decides to create a remote NFS file on
+     your Unix machine with the date in the filename.  Your Unix
+     directory then has this in it:
+ 
+ 	filename  inode
+ 
+ 	91/02/07  12357
+     
+     No amount of messing around with 'find' or 'rm' as described above
+     will delete this file, since those utilities and all other Unix
+     programs, are forced to interpret the '/' in the normal way. 
+ 
+     Any ordinary program will eventually try to do unlink("91/02/07"),
+     which as far as the kernel is concerned means "unlink the file 07
+     in the subdirectory 02 of directory 91", but that's not what we
+     have - we have a *FILE* named "91/02/07" in the current directory.
+     This is a subtle but crucial distinction. 
+ 
+     What can you do in this case?  
+     The first thing to try is to return to the Mac that created this
+     crummy entry, and see if you can convince it and your local NFS
+     daemon to rename the file to something without slashes.
+ 
+     If that doesn't work or isn't possible, drastic action by root is
+     required.   Use "ls -i" to find the inode number of this bogus
+     file, then unmount the file system and use "clri" to clear the
+     inode, and "fsck" the file system with your fingers crossed.
+     This destroys the information in the file.  If you want to
+     keep it, you can try:
+     
+ 	create a new directory in the same parent directory as the
+ 	one containing the bad file name;
+ 
+ 	move everything you can (i.e. everything but the file with
+ 	the bad name) from the old directory to the new one;
+ 
+ 	do "ls -id" on the directory containing the file with the
+ 	bad name to get its inumber;
+ 
+ 	umount the file system;
+ 
+ 	"clri" the directory containing the file with the bad name;
+ 
+ 	"fsck" the file system.
+ 
+     Then, to find the file,
+ 
+ 	remount the file system;
+ 
+ 	rename the directory you created to have the name of
+ 	the old directory (since the old directory should have
+ 	been blown away by "fsck")
+ 
+ 	move the file out of "lost+found" into the directory
+ 	with a better name.
+ 
+     Alternatively, you can patch the directory the hard way
+     by crawling around in the raw file system.
+     Use "fsdb", if you have it.
+     
      If none of these work, find your system manager.
  
  3)  How do I get a recursive directory listing?
***************
*** 452,465 ****
  	Bourne Shell:
  
  	    for f in *; do
! 		eval mv '"$f"' \"`echo "$f" | tr '[A-Z]' '[a-z]'`\"
  	    done
      
!     (Some versions of "tr" require the [ and ], some don't.  It happens 
!      to be harmless to include them in this particular example; versions of
!      tr that don't want the [] will conveniently think they are supposed
!      to translate '[' to '[' and ']' to ']').
  
      If you have the "perl" language installed, you may find this rename
      script by Larry Wall very useful.  It can be used to accomplish a
      wide variety of filename changes.
--- 554,572 ----
  	Bourne Shell:
  
  	    for f in *; do
!               g=`expr "xxx$f" : 'xxx\(.*\)' | tr '[A-Z]' '[a-z]'`
!               mv "$f" "$g"
! 
  	    done
      
!     The `expr' command will always print the filename, even if it equals`
!     `-n' or if it contains a System V escape sequence like `\c'.
  
+     Some versions of "tr" require the [ and ], some don't.  It happens 
+     to be harmless to include them in this particular example; versions of
+     tr that don't want the [] will conveniently think they are supposed
+     to translate '[' to '[' and ']' to ']'.
+ 
      If you have the "perl" language installed, you may find this rename
      script by Larry Wall very useful.  It can be used to accomplish a
      wide variety of filename changes.
***************
*** 755,761 ****
      sections 3m, 3n, 3x and 3yp among others.
  
  
! 19) What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
      stand for?
  
      awk = "Aho Weinberger and Kernighan"
--- 862,868 ----
      sections 3m, 3n, 3x and 3yp among others.
  
  
! 19) What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss,rc}
      stand for?
  
      awk = "Aho Weinberger and Kernighan"
***************
*** 853,858 ****
--- 960,983 ----
  	Confirmation courtesy of Eric Cooper, Carnegie Mellon
  	University
  
+     rc (as in ".cshrc" or "/etc/rc") = "RunCom"
+ 
+ 	"rc" derives from "runcom", from the MIT CTSS system, ca. 1965.
+ 
+ 	    'There was a facility that would execute a bunch of commands
+ 	    stored in a file; it was called "runcom" for "run commands",
+ 	    and the file began to be called "a runcom."
+ 
+ 	    "rc" in Unix is a fossil from that usage.'
+ 	
+ 	Brian Kernighan & Dennis Ritchie, as told to Vicki Brown
+ 
+ 
+ 	"rc" is also the name of the shell from the new Plan 9
+ 	operating system.
+ 
+ 
+ 
      Don Libes' book "Life with Unix" contains lots more of these
      tidbits.
  
***************
*** 865,873 ****
      There should be no difference in content between the
      mailing list and the newsgroup.   
  
! 	[Note: The newsgroup "comp.unix.wizards" was recently
! 	deleted, but the "Unix-Wizards" mailing list still exists.
! 	I'm not really sure how this is all going to sort itself out.]
  
      To get on or off either of these lists, send mail to
      Info-Unix-Request@brl.mil or Unix-Wizards-Request@brl.mil .
--- 990,999 ----
      There should be no difference in content between the
      mailing list and the newsgroup.   
  
! 	[Note: The newsgroup "comp.unix.wizards" was recently deleted,
! 	and even more recently resurrected; the "Unix-Wizards" mailing
! 	list still exists.  I'm not really sure how this is all going
! 	to sort itself out.]
  
      To get on or off either of these lists, send mail to
      Info-Unix-Request@brl.mil or Unix-Wizards-Request@brl.mil .
***************
*** 967,973 ****
      MIT's Project Athena has produced a comprehensive
      delete/undelete/expunge/purge package, which can serve as a
      complete replacement for rm which allows file recovery.  This
!     package was posted to comp.sources.unix (volume 18, issue 73).
  
  
  22) How can a process detect if it's running in the background?
--- 1093,1099 ----
      MIT's Project Athena has produced a comprehensive
      delete/undelete/expunge/purge package, which can serve as a
      complete replacement for rm which allows file recovery.  This
!     package was posted to comp.sources.misc (volume 17, issue 023-026)
  
  
  22) How can a process detect if it's running in the background?
***************
*** 1137,1144 ****
      made an exception: if it is a builtin command like ``read'', the current
      shell will execute it, else another subshell is created.
  
!     Draft 10 of POSIX 1003.2 allows both behaviours; future drafts may
!     explicitly specify only one of them though.
  
  26) How do I use popen() to open a process for reading AND writing?
      
--- 1263,1270 ----
      made an exception: if it is a builtin command like ``read'', the current
      shell will execute it, else another subshell is created.
  
!     POSIX 1003.2 allows both behaviours so portable scripts cannot depend
!     on any of them.
  
  26) How do I use popen() to open a process for reading AND writing?
      
***************
*** 1415,1421 ****
  	     this includes the special entries "." and "..",
  	     which often you don't want;
  
!     .[^.]*   (Newer shells only)  
  	     Matches all files that begin with a "." and are
  	     followed by a non-"."; unfortunately this will miss
  	     "..foo";
--- 1541,1548 ----
  	     this includes the special entries "." and "..",
  	     which often you don't want;
  
!     .[!.]*   (Newer shells only; some shells use a "^" instead of
! 	     the "!"; POSIX shells must accept the "!")  
  	     Matches all files that begin with a "." and are
  	     followed by a non-"."; unfortunately this will miss
  	     "..foo";
***************
*** 1440,1446 ****
  
      Answer by:
  	Martin Weitzel <@mikros.systemware.de:martin@mwtech.uucp>
! 	Maarten Litmaath <maart@cs.vu.nl>
  
      If you are sure the number of arguments is at most 9, you can use:
  
--- 1567,1573 ----
  
      Answer by:
  	Martin Weitzel <@mikros.systemware.de:martin@mwtech.uucp>
! 	Maarten Litmaath <maart@nat.vu.nl>
  
      If you are sure the number of arguments is at most 9, you can use:
  
***************
*** 1522,1528 ****
      To reverse the arguments there is still a simpler method, that even does
      not create subprocesses.  This approach can also be taken if you want
      to delete e.g. the last argument, but in that case you cannot refer
!     directly to the N-th argument anymore, because the `argvN' variables are
      set up in reverse order:
  
  	argv=
--- 1649,1655 ----
      To reverse the arguments there is still a simpler method, that even does
      not create subprocesses.  This approach can also be taken if you want
      to delete e.g. the last argument, but in that case you cannot refer
!     directly to the N-th argument any more, because the `argvN' variables are
      set up in reverse order:
  
  	argv=
***************
*** 1537,1774 ****
  	eval set x "$argv"
  	shift
  
! 33) How do I pronounce "vi" , or "!", or "/*", or ...?
  
-     You can start a very long and pointless discussion by wondering
-     about this topic on the net.  Some people say "vye", some say
-     "vee-eye" (the vi manual suggests this) and some Roman numerologists
-     say "six".  How you pronounce "vi" has nothing to do with whether
-     or not you are a true Unix wizard.
- 
-     Similarly, you'll find that some people pronounce "char" as "care",
-     and that there are lots of ways to say "#" or "/*" or "!" or
-     "tty" or "/etc".  No one pronunciation is correct - enjoy the regional
-     dialects and accents.  
- 
-     Since this topic keeps coming up on the net, here is a comprehensive
-     pronunciation list that has made the rounds.  Send updates to
-     Steve Hayman, sahayman@cs.indiana.edu.  Special thanks to Maarten
-     Litmaath for his work in maintaining this list in the past.
- 

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (04/03/91)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions.  You can also ftp the most recent version from
iuvax.cs.indiana.edu (129.79.254.192), where it's
"pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".
(IUVax also runs a mail server, for those of you unable to ftp.
 Send the line "HELP" to "mailserv@iuvax.cs.indiana.edu" to get started.)

*** /tmp/,RCSt1a09321	Tue Apr  2 17:13:57 1991
--- part2	Tue Apr  2 17:13:48 1991
***************
*** 1,6 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 91/03/01 17:04:08 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions.  Please don't ask these questions
--- 1,6 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 91/04/02 17:13:41 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions.  Please don't ask these questions
***************
*** 204,218 ****
      crummy entry, and see if you can convince it and your local NFS
      daemon to rename the file to something without slashes.
  
!     If that doesn't work or isn't possible, drastic action by root is
!     required.   Use "ls -i" to find the inode number of this bogus
!     file, then unmount the file system and use "clri" to clear the
!     inode, and "fsck" the file system with your fingers crossed.
!     This destroys the information in the file.  If you want to
!     keep it, you can try:
!     
! 	create a new directory in the same parent directory as the
! 	one containing the bad file name;
  
  	move everything you can (i.e. everything but the file with
  	the bad name) from the old directory to the new one;
--- 204,218 ----
      crummy entry, and see if you can convince it and your local NFS
      daemon to rename the file to something without slashes.
  
!     If that doesn't work or isn't possible, you'll need help from your
!     system manager, who will have to try the one of the following.
!     Use "ls -i" to find the inode number of this bogus file, then
!     unmount the file system and use "clri" to clear the inode, and
!     "fsck" the file system with your fingers crossed.  This destroys
!     the information in the file.  If you want to keep it, you can try:
! 
! 	create a new directory in the same parent directory as the one
! 	containing the bad file name;
  
  	move everything you can (i.e. everything but the file with
  	the bad name) from the old directory to the new one;
***************
*** 241,247 ****
      by crawling around in the raw file system.
      Use "fsdb", if you have it.
      
-     If none of these work, find your system manager.
  
  3)  How do I get a recursive directory listing?
  
--- 241,246 ----
***************
*** 556,565 ****
  	    for f in *; do
                g=`expr "xxx$f" : 'xxx\(.*\)' | tr '[A-Z]' '[a-z]'`
                mv "$f" "$g"
- 
  	    done
      
!     The `expr' command will always print the filename, even if it equals`
      `-n' or if it contains a System V escape sequence like `\c'.
  
      Some versions of "tr" require the [ and ], some don't.  It happens 
--- 555,563 ----
  	    for f in *; do
                g=`expr "xxx$f" : 'xxx\(.*\)' | tr '[A-Z]' '[a-z]'`
                mv "$f" "$g"
  	    done
      
!     The `expr' command will always print the filename, even if it equals
      `-n' or if it contains a System V escape sequence like `\c'.
  
      Some versions of "tr" require the [ and ], some don't.  It happens 
***************
*** 1339,1349 ****
      unlucky.
  
      There is no standard library function that you can count on in all
!     environments for "napping" (the usual name for short sleeps).  The
!     following code is adapted from Doug Gwyn's System V emulation
!     support for 4BSD and exploits the 4BSD select() system call.  On
!     System V you might be able to use poll() in a similar way.
  
      /*
  	    nap -- support routine for 4.2BSD system call emulations
  
--- 1337,1352 ----
      unlucky.
  
      There is no standard library function that you can count on in all
!     environments for "napping" (the usual name for short sleeps).
!     Some environments supply a "usleep(n)" function which suspends
!     execution for n microseconds.  If your environment doesn't support
!     usleep(), here are a couple of implementations for BSD and
!     System V environments.
  
+     The following code is adapted from Doug Gwyn's System V emulation
+     support for 4BSD and exploits the 4BSD select() system call.  
+     (You probably want to call it "usleep()" instead of "nap()" )
+ 
      /*
  	    nap -- support routine for 4.2BSD system call emulations
  
***************
*** 1369,1374 ****
--- 1372,1419 ----
  	    return select( 0, (long *)0, (long *)0, (long *)0, &delay );
  	    }
  
+     On System V you might do it this way:
+ 
+     /*
+ 
+     subseconds sleeps for System V - or anything that has poll()
+     Don Libes, 4/1/1991
+ 
+     The BSD analog to this function is defined in terms of microseconds
+     while poll() is defined in terms of milliseconds.  For compatibility,
+     this function provides accuracy "over the long run" by truncating
+     actual requests to milliseconds and accumulating microseconds across
+     calls with the idea that you are probably calling it in a tight loop,
+     and that over the long run, the error will even out.
+ 
+     If you aren't calling it in a tight loop, then you almost certainly
+     aren't making microsecond-resolution requests anyway, in which case
+     you don't care about microseconds.  And if you did, you wouldn't be
+     using UNIX anyway because random system indigestion (i.e., scheduling)
+     can make mincemeat out of any timing code.
+ 
+     Returns 0 if successful timeout, -1 if unsuccessful.
+ 
+     */
+ 
+     #include <poll.h>
+ 
+     int
+     usleep(usec)
+     unsigned int usec;		/* microseconds */
+     {
+ 	    static subtotal = 0;	/* microseconds */
+ 	    int msec;		/* milliseconds */
+ 
+ 	    subtotal += usec;
+ 	    /* if less then 1 msec request, do nothing but remember it */
+ 	    if (subtotal < 1000) return(0);
+ 	    msec = subtotal/1000;
+ 	    subtotal = subtotal%1000;
+ 	    return poll((struct pollfd *)0,(unsigned long)0,msec);
+     }
+ 
+ 
      Another possibility for nap()ing on System V, and probably other
      non-BSD Unices is Jon Zeeff's s5nap package, posted to
      comp.sources.misc, volume 4.  It does require a installing
***************
*** 1542,1548 ****
  	     which often you don't want;
  
      .[!.]*   (Newer shells only; some shells use a "^" instead of
! 	     the "!"; POSIX shells must accept the "!")  
  	     Matches all files that begin with a "." and are
  	     followed by a non-"."; unfortunately this will miss
  	     "..foo";
--- 1587,1596 ----
  	     which often you don't want;
  
      .[!.]*   (Newer shells only; some shells use a "^" instead of
! 	     the "!"; POSIX shells must accept the "!", but may
! 	     accept a "^" as well; all portable application shall
! 	     not use an unquoted "^" immediately following the "[")
! 
  	     Matches all files that begin with a "." and are
  	     followed by a non-"."; unfortunately this will miss
  	     "..foo";
***************
*** 1559,1567 ****
      an external program or two and use backquote substitution.
      This is pretty good:
  
!     `ls -a | sed -e '/^\.$/d' -e '/^\.\.$/d'`
  
!     but even it will mess up on files with newlines in their names.
  
  32) How do I find the last argument in a Bourne shell script?
  
--- 1607,1618 ----
      an external program or two and use backquote substitution.
      This is pretty good:
  
!     `ls -a | sed -e '/^\.$/d' -e '/^\.\.$/d'`    
! 
! 	(or `ls -A` in some Unix versions)
  
!     but even it will mess up on files with newlines, IFS characters
!     or wildcards in their names.
  
  32) How do I find the last argument in a Bourne shell script?
  
***************
*** 1679,1685 ****
      part of this document?
  
      Since its inception in 1989, this FAQ document included a comprehensive
!     pronunciation list created by Maarten Litmaath (thanks, Maarten!).
      
      I've retired it, since it is not really relevant to the topic of
      "Unix questions".  You can still find it as part of the
--- 1730,1737 ----
      part of this document?
  
      Since its inception in 1989, this FAQ document included a comprehensive
!     pronunciation list maintained by Maarten Litmaath (thanks, Maarten!).
!     (Does anyone know who *created* it?)
      
      I've retired it, since it is not really relevant to the topic of
      "Unix questions".  You can still find it as part of the

Steve Hayman <sahayman@iuvax.cs.indiana.edu> (05/03/91)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions.  You can also ftp the most recent version from
iuvax.cs.indiana.edu (129.79.254.192), where it's
"pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".
(IUVax also runs a mail server, for those of you unable to ftp.
 Send the line "HELP" to "mailserv@iuvax.cs.indiana.edu" to get started.)

***************
*** 1,6 ****
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 91/04/02 17:13:41 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions.  Please don't ask these questions
--- 1,6 ----
  Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  
! [Last changed: $Date: 91/05/02 18:39:31 $ by $Author: sahayman $]
  
  This article contains the answers to some Frequently Asked Questions
  often seen in comp.unix.questions.  Please don't ask these questions
***************
*** 58,64 ****
  	32) How do I find the last argument in a Bourne shell script?
  	33) How can I find out which user or process has a file open or is using
  	    a particular file system (so that I can unmount it?)
! 	34) What happened to the pronunciation list that used to be
  	    part of this document?
  
  
--- 58,67 ----
  	32) How do I find the last argument in a Bourne shell script?
  	33) How can I find out which user or process has a file open or is using
  	    a particular file system (so that I can unmount it?)
! 	34) How do I keep track of people who are fingering me?
! 	35) How do I find out the process ID of a program with a particular
! 	    name from inside a shell script or C program?
! 	36) What happened to the pronunciation list that used to be
  	    part of this document?
  
  
***************
*** 1345,1354 ****
  
      The following code is adapted from Doug Gwyn's System V emulation
      support for 4BSD and exploits the 4BSD select() system call.  
!     (You probably want to call it "usleep()" instead of "nap()" )
  
      /*
! 	    nap -- support routine for 4.2BSD system call emulations
  
  	    last edit:	29-Oct-1984	D A Gwyn
      */
--- 1348,1358 ----
  
      The following code is adapted from Doug Gwyn's System V emulation
      support for 4BSD and exploits the 4BSD select() system call.  
!     Doug originally called it 'nap()'; you probably want to call it
!     "usleep()";
  
      /*
! 	    usleep -- support routine for 4.2BSD system call emulations
  
  	    last edit:	29-Oct-1984	D A Gwyn
      */
***************
*** 1357,1363 ****
  
  
      int
!     nap( usec )					/* returns 0 if ok, else -1 */
  	    long		usec;		/* delay in microseconds */
  	    {
  	    static struct			/* `timeval' */
--- 1361,1367 ----
  
  
      int
!     usleep( usec )				/* returns 0 if ok, else -1 */
  	    long		usec;		/* delay in microseconds */
  	    {
  	    static struct			/* `timeval' */
***************
*** 1403,1416 ****
      unsigned int usec;		/* microseconds */
      {
  	    static subtotal = 0;	/* microseconds */
! 	    int msec;		/* milliseconds */
  
  	    subtotal += usec;
  	    /* if less then 1 msec request, do nothing but remember it */
  	    if (subtotal < 1000) return(0);
  	    msec = subtotal/1000;
  	    subtotal = subtotal%1000;
! 	    return poll((struct pollfd *)0,(unsigned long)0,msec);
      }
  
  
--- 1407,1426 ----
      unsigned int usec;		/* microseconds */
      {
  	    static subtotal = 0;	/* microseconds */
! 	    int msec;			/* milliseconds */
  
+ 	    /* 'foo' is only here because some versions of 5.3 have
+ 	     * a bug where the first argument to poll() is checked
+ 	     * for a valid memory address even if the second argument is 0.
+ 	     */
+ 	    struct pollfd foo;
+ 
  	    subtotal += usec;
  	    /* if less then 1 msec request, do nothing but remember it */
  	    if (subtotal < 1000) return(0);
  	    msec = subtotal/1000;
  	    subtotal = subtotal%1000;
! 	    return poll(&foo,(unsigned long)0,msec);
      }
  
  
***************
*** 1588,1594 ****
  
      .[!.]*   (Newer shells only; some shells use a "^" instead of
  	     the "!"; POSIX shells must accept the "!", but may
! 	     accept a "^" as well; all portable application shall
  	     not use an unquoted "^" immediately following the "[")
  
  	     Matches all files that begin with a "." and are
--- 1598,1604 ----
  
      .[!.]*   (Newer shells only; some shells use a "^" instead of
  	     the "!"; POSIX shells must accept the "!", but may
! 	     accept a "^" as well; all portable applications shall
  	     not use an unquoted "^" immediately following the "[")
  
  	     Matches all files that begin with a "." and are
***************
*** 1599,1611 ****
  	     at least 3 characters long.  This neatly avoids
  	     "." and "..", but also misses ".a" . 
  
!     
!     Many people are willing to use .??* to match all dotfiles
!     (or * .??* to match all files) even though that pattern doesn't
!     get everything - it has the advantage of being easy to type.
!     If you really do want to be sure, you'll need to employ
!     an external program or two and use backquote substitution.
!     This is pretty good:
  
      `ls -a | sed -e '/^\.$/d' -e '/^\.\.$/d'`    
  
--- 1609,1622 ----
  	     at least 3 characters long.  This neatly avoids
  	     "." and "..", but also misses ".a" . 
  
!     So to match all files except "." and ".." safely you have to use
!     3 patterns (if you don't have filenames like ".a" you can leave out
!     the first):
! 
! 	.[!.] .??* *
! 
!     Alternatively you could employ an external program or two and use
!     backquote substitution.  This is pretty good:
  
      `ls -a | sed -e '/^\.$/d' -e '/^\.\.$/d'`    
  
***************
*** 1726,1732 ****
      can be found in archives of comp.sources.unix, volume 18.
  
  
! 34) What happened to the pronunciation list that used to be
      part of this document?
  
      Since its inception in 1989, this FAQ document included a comprehensive
--- 1737,1824 ----
      can be found in archives of comp.sources.unix, volume 18.
  
  
! 34) How do I keep track of people who are fingering me?
! 
!     Generally, you can't find out the userid of someone who is
!     fingering you from a remote machine.  You may be able to
!     find out which machine the remote request is coming from.
!     One possibility, if your system supports it and assuming
!     the finger daemon doesn't object, is to make your .plan file a
!     "named pipe" instead of a plain file.  (Use 'mknod' to do this.)
! 
!     You can then start up a program that will open your .plan file
!     for writing; the open will block until some other process
!     (namely fingerd) opens the .plan for reading.  Now, not only
!     can you write whatever you want through this pipe (which lets
!     you show different .plan information every time someone
!     fingers you), you can use getpeername() to find out the name of the
!     peer connected to this socket, which will let you find out from
!     which remote machine the finger request originates.
! 
!     Of course, this may not work at all if your system doesn't
!     support named pipes or if your local fingerd insists
!     on having plain .plan files.
! 
!     Getting the remote userid would require that the remote site be
!     running some sort of RFC931-style authorization daemon, which
!     relatively few sites currently run.
! 
! 35) How do I find out the process ID of a program with a particular
!     name from inside a shell script or C program?
! 
!     In a shell script: 
! 
!     There is no utility specifically designed to map between program names
!     and process IDs.  Furthermore, such mappings are often unreliable,
!     since it's possible for more than one process to have the same name,
!     and since it's possible for a process to change its name once it
!     starts running.  However, a pipeline like this can often be used to
!     get a list of processes (owned by you) with a particular name:
! 
! 	    ps ux | awk '/name/ && !/awk/ {print $2}'
! 
!     You replace "name" with the name of the process for which you are
!     searching.
! 
!     The general idea is to parse the output of ps, using awk or grep or
!     other utilities, to search for the lines with the specified name on
!     them, and print the PID's for those lines.  Note that the "!/awk/"
!     above prevents the awk process for being listed.
! 
!     You may have to change the arguments to ps, depending on what kind of
!     Unix you are using.
! 
!     In a C program: 
! 
!     Just as there is no utility specifically designed to map between
!     program names and process IDs, there are no (portable) C library
!     functions to do it either.
! 
!     However, some vendors provide functions for reading Kernel memory; for
!     example, Sun provides the "kvm_" functions, and Data General provides
!     the "dg_" functions.  It may be possible for any user to use these, or
!     they may only be useable by the super-user (or a user in group "kmem")
!     if read-access to kernel memory on your system is restricted.
!     Furthermore, these functions are often not documented or documented
!     badly, and might change from release to release.
! 
!     Some vendors provide a "/proc" filesystem, which appears as a
!     directory with a bunch of filenames in it.  Each filename is a number,
!     corresponding to a process ID, and you can open the file and read it
!     to get information about the process.  Once again, access to this may
!     be restricted, and the interface to it may change from system to
!     system.
! 
!     If you can't use vendor-specific library functions, and you don't have
!     /proc, and you still want to do this completely in C, you are going to
!     have to do the grovelling through kernel memory yourself.  For a good
!     example of how to do this on many systems, see the sources to
!     "ofiles", available in the comp.sources.unix archives.
! 
!     If all else fails, you can call popen() on "ps" and parse its output.
! 
! 
! 36) What happened to the pronunciation list that used to be
      part of this document?
  
      Since its inception in 1989, this FAQ document included a comprehensive

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (06/01/91)

Here are the most recent changes to parts 1 and 2 of the
Frequently Asked Questions articles, which have just been
posted.  You can find the full articles elsewhere in
comp.unix.questions.  You can also ftp the most recent version from
iuvax.cs.indiana.edu (129.79.254.192), where it's
"pub/Unix-Questions.part1" and "pub/Unix-Questions.part2".
(IUVax also runs a mail server, for those of you unable to ftp.
 Send the line "HELP" to "mailserv@iuvax.cs.indiana.edu" to get started.)


[I haven't made any changes this month.  I'm getting married later
today and have other things on my mind at the moment.  But, the list
must go out...]

[P.S.  This month marks the 2nd birthday of the Frequently Asked Questions
list.  Thanks, everybody, for all the help.]