Search the FAQ Archives

3 - A - B - C - D - E - F - G - H - I - J - K - L - M
N - O - P - Q - R - S - T - U - V - W - X - Y - Z
faqs.org - Internet FAQ Archives

[DRAFT FAQ] The Well-Tempered Unix Application


[ Usenet FAQs | Web FAQs | Documents | RFC Index | Business Photos and Profiles ]
Archive-name: unix-faq/programmer/application-principles
Version: $Id: wtua,v 1.15 2000/01/21 11:57:58 rsk Exp $

See reader questions & answers on this topic! - Help others by sharing your knowledge
Copyright Rich Kulawiec, 1997, 1998, 1999, 2000.

[ January 2000 update: currently being rewritten. ]

READ THIS NOTE:

	I receive an average of hundreds of mail messages per day.  If you
	want to make sure that your update/correction/reply to this
	article comes to my attention when I'm working on the next
	version, please send your message as a reply to this article,
	i.e. make absolutely certain that you preserve the "Subject:"
	line.  If you don't do this, your reply may sit in one of my
	numerous mail queues for months or even years.

	Please don't send an update more than once -- doing so only
	adds to the queue that I have to process when doing updates.
	If you want to make certain that I've received something, then
	make a note of the information on the "Version:" line above.
	If it has changed when you next see this article, and your
	information isn't included, then I've missed it.  Otherwise,
	it's safe to presume I've got it and it's queued for inclusion.

	The FAQ may be reproduced and propagated via http, ftp, gopher
	or other common Internet protocols by anyone provided that (1)
	it is reproduced in its entirety (2) no fee is charged for access
	to it and (3) it's kept up-to-date.  This latter is probably best
	accomplished by mirroring one of the FAQ archives -- that way
	you'll get a new copy everytime I update it, which is
	approximately monthly.   (If you do put it up on the web, I'd
	like to know the URL, but that's not a requirement.  It just
	would be nice.)

	Reproduction of this FAQ on paper, CDROM or other media which
	are sold is permissible only with the express written consent
	of its author.

	If you are reading a copy of this document which appears to be
	out-of-date, there are a variety of methods that you can use to
	retrieve the most current method.  If you are familiar with access
	to the FAQ archives via mail, ftp, and www, then you already know how.
	If not,	 then send email to mail-server@rtfm.mit.edu with the command
	"send usenet/news.answers/news-answers/introduction" in the message,
	and a complete guide to FAQ retrieval will be mailed to you.

Q. Why does this document exist?

A. This is an attempt to spell out some general principles that Unix
application developers should consider in order to make the products
of their work portable, easy to install and maintain, and flexible.
It's somewhat targeted toward developers of commercial software,
although folks developing freely-available code may also find some
guidance here.

Much of it is opinion -- but a lot of that opinion has been formed by
people who have installed hundreds of software packages on dozens
of varieties of Unix.  The intention here isn't to inflict capricious
whims on software developers; the intention is to keep them from
doing the same to system administrators.


Q. What should I assume about current OS releases?

A. That they'll change. ;-)

More seriously, the Unix world is one of short release cycles; Sun's 
Solaris 2.7 is now being widely deployed and we're already seeing
reports on future beta releases.  Locking one's software into the
specific features of a release is generally a Bad Thing.  There's
also the question of deprecated releases (e.g. SunOS) and newly-emerging
ones (e.g. SUSE Linux).  Generally speaking, the tradeoff is one of
trying to exploit the unique features of OS's for maximum programmatic
advantage vs. trying to keep code as simple and as portable as possible.
Your editor strongly recommends the latter and suggests that necessary
performance criteria can almost always be met by a combination of
other means, e.g. better choice of algorithm, optimizing compilers,
hardware upgrades, and so on.


Q. What about all those standards?

A.  In general, software packages should attempt to comply as much as is
practical with the prevailing Unix software standards: POSIX 1003.1,
POSIX 1003.3, SVID, and XPG.  Unfortunately, these comprise a maze
of overlapping and occasionally conflicting requirements.

One way out of that maze is to try, as much as possible, to avoid
developing products which rely on features over which there is
disagreement.  Obvious, and easier said than done, but when there
are major differences of opinion among standardization efforts,
it may be better to duck the issue rather than contest it.


Q. What about the windowing system environment?

A. Applications should be compatible with currently shipping X-based window
environments from various vendors, some of which are based on X11R4,
some on X11R5, and some on X11R6.  In general, attempts to support
and utilize the features of X11R6 are encouraged.

Applications should work with any window manager, e.g. olwm, twm, etc.
Compliance with the ICCCM standard will assist with this.


Q. What about the Networking environment?

A. Use of Internet standard protocols and mechanisms are *highly* encouraged.

This includes:

	SMTP	(See RFC 821, 822) for mail
	NNTP	(See RFC's 977 and 1036) for news
	Telnet	(See RFC's 854, 855) for interactive login
	FTP	(See RFC 959) for file transfer
	HTTP	(See RFC 2068) for WWW services
	NTP	(See RFC's 1129, 1305) for time synchronization
	DNS	(See RFC 1032, 1033) for hostname resolution
	SSH	(See RFC ????)

Also, RFC 1123 ("Requirements for Internet hosts - application and support")
should be studied and its requirements adhered to as much as possible.

Use of the NIS/NIS+ environment should be selectable; i.e. the installer
of the software package should be presented with the option to
utilize NIS/NIS+ services at the time of the installation.  No package
should require explicit entries in the local system's /etc/hosts file.
Kerberos support is encouraged.

Use of NFS is ubiquitous, and all software packages should operate with
NFS in a transparent manner but should not *require* it.  Use of NFS 3.0
features where they are available is a good idea.  In addition, software
packages should cooperate with the automounter; in particular, there must
be provisions to ensure that the physical mount point of the package
(e.g. <servername>:/<directory>/<package-name>) may be different that
logical automount point of the package (e.g. /home/<package-name>).

Two issues that often arise with NFS are:

	1. A "pwd" executed in an automounted directory will
	show something like

		/tmp_mnt/server/export/foo

	even though the directory is really mounted on

		/import/foo

	2. If NFS is used with the default options that most Unixes
	employ, UID 0 (root) maps to UID -1 (nobody, or 65534).
	in other words, root access to an NFS-mounted filesystem
	sometimes requires remounting the filesystem with different
	options, or - if that can't be done - executing part of an
	installation script/procedure on another machine.

Use of RFS and Andrew distributed filesystems should be optional,
as these filesystems are not universally supported.  (This isn't
a comment on the merits of those filesystems, by the way: it's just
an observation on their propagation.)

An application which requires the of temporary "scratch" disk space
should allow that space to be resident anywhere on the local
(executing) machine.  The way that some programs do this (e.g.
GNU's gcc) is to use the environment variables "TMPDIR" -- which gives
the name of the directory to use for "scratch" space.

On that topic -- and on mkstemp()/mktemp() -- let me quote Paul D. Smith:

	ALL_ programs that attempt to creat temp files should honor
	this variable.

	Also, _all_ programs that need temporary files should use the
	mkstemp() function if available, or the mktemp() function if
	not, to get a temporary filename.  This can help avoid
	security problems, denial-of-service attacks, etc.

Paul goes on to mention that he thinks this is a POSIX function; I think
so, too; are we right?  (I can't find my copy of the POSIX standard
this afternoon.)

Applications should also work seamlessly with memory-resident filesystems
(e.g. Sun's tmpfs). 

Use of interprocess communication facilities should be carefully done
in order to avoid collision with port numbers assigned by the Internet
Assigned Numbers Authority.  Ideally, applications should allow the 
installer to specify port numbers used.  Applications which need
to function in a firewalled environment should provide proxies.


Q. What about licensing mechanisms?

A. Use of standard network-based licensing mechanisms, for example FlexLM,
is HIGHLY encouraged.  (Although it needs to be noted that most FlexLM
implementations rely on hostid locking for the license server.  This isn't
a limitation of FlexLM: it's possible to give out keys which aren't locked
to a particular machine by using the ANY keyword in the hostid field.
However, vendors fear that people will set up license servers on multiple
machines, and thus steal their products.  Thanks to Mark C. Henderson
for pointing this out.)  Licensing methods which rely in any part on hostname,
IP address, hostid, username, or userid are discouraged because
they tend to cause nightmares for system administrators when they have
to change machines, or subnets, or any of the other myriad things that
are part of evolving networks.

All that said, consider that it's possible for sufficiently smart and
motivated programmers/administrators to bypass just about any licensing
mechanism.  Depending on what your product is, and what the intended
user community is, it may be easier to just skip the entire exercise.

Q. What about the Unix environment in general?

A. While the user of a dedicated loginname/uid to provide administration within
a package is acceptable, no loginname/uid should be mandated.  In other
words, if a database application is designed to be administered by an
end-user account, the loginname/uid/groupname/gid of that account
must be selectable by the installer and no constraints should be
placed upon it.

No package should require users to have a particular loginname/uid/gid
in order to utilize any feature of that package.  (Obvious exceptions
would include system administration tools that require root priviledges
to execute certain commands, modify certain files, etc.)

Every application should make extreme attempts to avoid changes to
the / or /usr filesystems; these are reserved for the Unix operating system,
and are not appropriate installation locations for 3rd-party software.
(This comment doesn't apply to /usr/local, which is the de facto standard
for the installation of non-OS software.)

Applications which require daemons to be launched at boot time should NOT
modify /etc/rc.local (or its equivalent) in order to accomplish this; they
should generate the appropriate /bin/sh fragment and request that
the installer manually edit the appropriate files -- or provide the
option for the installer to examine the fragment and then have it
installed in /etc/rc.local.  For System-V style systems, the install
script could generate the appropriate startup script, allow the
installer to examine it, and then install it in the appropriate
directories (e.g. /etc/rc/rc1.d, /etc/rc/rc2.d, and so on).

(In fact, most Unixes and Linuxes are migrating to this sort of
startup, so it's probably preferable to use this facility over
the BSD one, if it's available.)

The reason for this is that it's difficult for an installation
script to figure out enough about a particular machine's configuration
to determine just where such startup code should be placed.  Allowing
the installer to interact with this process and/or to handle this step
semi-manually is often necessary.  This isn't to say that a
non-interactive way of handling this can't be included too -- because
that's handy for non-interactive installs.

Similar comments apply to /etc/inetd.conf, /etc/services, /etc/fstab,
and other critical files.

All packages should be installable at any point in the directory structure.
No packages should require the creation of hard links, symbolic links,
directories, or files on client (diskless or dataless) client workstations.
No hardwired pathnames should exist inside the application.  (That's
what environment variables and "dotfiles" are for; see below.  There's
debate on this point, I should note: some folks contend that
"configurable at run time" is a bad idea or impossible for setuid
programs.  I think that a setuid program can read everything it needs
from a config file whose pathname is hardwired into it -- which
means that it doesn't strictly adhere to this principle, but it
comes pretty close.)

Timothy J. Lee points out (and I agree with him) that:
"One point of annoyance with some programs is shared libraries, since if
the program is not compiled with the correct rpath, the user must have 
the LD_LIBRARY_PATH environment variable set to find all of the proper 
shared libraries.  Freeware programs should take that into account and 
set the rpath properly when linking.  Binary distributions are in a    
tougher situation, especially if it is not known where the program will
be installed."

Use of application-specific environment variables should be minimized;
applications which require large numbers of per-user variables to be
initialized should utilize a "dotfile" or a wrapper instead.  For example,
the Foobar software package might use a .foobarrc which contains initialization
information for that application.  Appropriate provisions for host-wide
and site-wide instantiations of these files should be provided, e.g.
the X11 .Xdefaults/"app-defaults"/command-line-option mechanism.

Wrappers are shell scripts (or Perl scripts, or other kinds of scripts)
which set the appropriate environment variables and then call the
real application.  For example, a package containing commands called
"foo1", "foo2", and "foo3" might put the real executables in

	/usr/local/lib/foo-app/foo1
	/usr/local/lib/foo-app/foo2
	/usr/local/lib/foo-app/foo3

and install a shell script in /usr/local/bin, hardlinked to foo1,
foo2, and foo3, which looks something like:

	#!/bin/sh

	FOOENV=/foo/bar
	ANOTHERFOOENV=fred
	export FOOENV ANOTHERFOOENV

	exec /usr/local/lib/foo-app/`basename $0`

This provides a single point-of-entry to all of the sub-applications
in the package, avoids cluttering the user's environment, and makes
life much easier for system admins.

Additionally, no application should modify a users's existing "dotfiles",
e.g. ".cshrc", but should intead confine changes to an application-specific
dotfile.

In any case, any application-specific environment variables should be carefully
distinguished from those which might be utilized by another application.
For example, FOOBAR_DIRECTORY is vastly preferable to DIRECTORY.

It is permissible for an application to use well-known, standard environment
variables (e.g. EDITOR) but it should not create or modify these.

Use of non-standard printing mechanisms is highly discouraged.  Applications
should spool using the standard lp or lpd print commands.  Ralf Fassel adds
"In addition, the print command itself should be configurable, not only the
printer name.  We have our own cross-platform mechanism to select the
printer according to the document type.  Each vendor has its own mechanism,
and it's a nightmare to set up all the /etc/printcap's or
/var/spool/lp/interface files."  And I concur with him.

The executables within an application (binaries, shell scripts, Perl scripts,
etc.) should be carefully scrutinized to ensure that their names do
not overlap with standard Unix commands or with vendor-supplied Unix
commands.  (Note: add list of commands in appendix)

The use of custom kernels should be avoided if possible; in particular,
the use of special device drivers for reasons other than special hardware
is highly discouraged, as this makes life very difficult for large sites,
especially when they attempt to upgrade their OS version.

Under no circumstances should an application replace any of the
normal commands (e.g. those in /usr/bin) with its own.  If for some
reason, an application requires a modified version of such a command,
it should reside in the application's own directory tree and should
be clearly identified at the time of the installation.  (This lets
users select which version of a command they wish to run based on $path.)

Applications should make no requirements on the filesystem/network
architecture; in other words, a switched/routed network consisting
of diskless, dataless, and dataful nodes with local and remote
/ and /usr partitions using hard-mounted and automounted filesystems
should run the application seamlessly.  (But it should be noted
that for some applications, NFS, due to its basic design, probably
just won't work.)

Applications should preserve localization options when upgraded
versions are installed.

Harald Kirsch notes -- and I think he's quite right -- that:

"No executable (or shell script) should try to guess the package's
installation directory from argv[0] (or $0), because due to (soft)
links or mounting, the directory part of the name might be totally
misleading. Use environment variables instead."

Q. What about accounting and security mechanisms?

A. Use of standard Unix accounting methods is highly encouraged.

No application should require weakening of network security
by mandating use of /etc/hosts.equiv, /.rhosts, or ~<user>/.rhosts.

Applications should utilize standard Unix security mechanisms, such
as /etc/group, whenever possible.  This implies that applications
understand the limits on these mechanisms, e.g. MAXGROUPS.

No assumptions about the current state of any user's umask should be made.
The installation script should explicitly specify the permissions
and ownerships of all files and directories; these should be set in
order to provide the maximum possible data security without rendering
the application non-functional.  In particular, no application should
require write access for its users anywhere in its own directory tree.

The use of the setuid/setgid bits should be carefully limited.
Setuid/setgid shell scripts be avoided if at all possible -- especially
since some Unix implementations don't support them at all.

The location of "lockfiles" should be configurable, as should the
mechanism (e.g. flock(), lockf(), etc.)  Frank da Cruz points out
(and I think he's right, although I sure wish he wasn't) that
"This is, of course, a hornet's nest.  Even if I configure an
application to use the politically correct lockfile conventious du
jour, they will change out from under the application I just installed
when I install a new OS release or even another application (uucp
lockfiles are the worst)."

So maybe I should back off a bit on my statement about lockfiles;
is there a way out of this that doesn't put the application
developer in the position of trying to outguess the installer?

Applications should not require the user to grant general 
read/write/execute permission to his or her own directory tree.


Q. Are there any other general comments?

A. If shell scripts are supplied as part of a package, the Bourne
shell is preferred.

If source code is supplied as part of a package, ANSI C/C++
is preferred.

Use of Perl should be carefully considered, as it is not yet shipped with
all production Unix releases.  But it is easily available and since it's
GPL'd, it can be included with software distributions.

Applications should suppport transparent data interchange between
releases and platforms.  For example, a Sun running Solaris 2.7
should be able to use the client side of a database package to
interrogate a database server running on Red Hat Linux 5.2.

The use of flexible, informative, and easily customizable installation
scripts such as the those supplied wilth Perl 5.0 or the GNU tools
is highly encouraged.  (These scripts actively seek out system information
and interact with the installer in order to confirm that the automated
installation will be based on verified data.)  

Q. What about installation procedures?

A.  Application installation guides should clearly identify the following:

	Operating system requirements (including revision #)
	Operating system options requirement (many OS's do not require
		full installation, need to know which OS features must
		be installed to support application)
	Operating system patches required (should reference vendor's #)
	Required kernel configuration/changes
	Windowing system requirements
	Required daemons/services (e.g. /etc/services, /etc/inetd.conf,
			/etc/rc.local)
	Required utilities
	Supported hardware platforms
	Supported hardware options (e.g. graphics)
	Memory/disk/swap requirements for minimum functionality/full-blown
		install, including use of temporary/scratch file system space.
	Estimates of user data storage requirements based on usage.
	Performance characterization in different local/network architectures
		with suggestions for first-order performance tuning.


Installation procedures should be informative and include provisions
for soft failure in the event of a problem.  Logging of the installation
process should be done in order to enable post-mortem analysis.

Installation procedures should be fully executable by the "application
maintenance account", which will probably not be root, if it's at
all possible to do so.  (And that's probably not possible for programs
that need to work with more than one UID.)  Accordingly,
any installation-related changes which require root access must be
clearly identified (e.g. modififying /etc/group, /etc/services).

Any application procedures which must be executed by root should
be scripts and *not* binaries -- in order to allow the system
administrator to examine them before running them.  If for some
reason, a binary executable is necessary, then full source code
and a Makefile should be provided in order to enable compilation
on the local machine.

Installation procedures should support a "deinstall" facility.
Peter da Silva points out that "Ideally this should be a script that
can be eyeball-executed in case the system isn't entirely stable
when cleanup time arrives, rather than a binary."  I think what Peter
means by that is that an admin who is trying to deal with a system
whose state is confused or unknown would probably feel much better
manually executing the commands in the script one by one, rather
than having to execute the entire script -- or worse, a binary
whose precise actions are unknown.

Installation procedures should work with local and remote devices,
e.g. tape and cdrom.

Install procedures should be scriptable and executable in a
non-interactive way.  Non-interactive install capability helps a
system administrator who is setting up a large number of computers,
each with the same package.  (Or, as Greg Lindahl put it, "[...] remember
that some sites may want to install your product on 1,000 servers.
Forcing them to reverse-engineer your installation procedure will
not make friends.")


Q. How should I track revision levels on my package?

A. This is a thorny question, to which the best answer is "simply".
Your editor would like to recommend the following standard for all
Unix software packages:

	<Release>.<Patchlevel>

e.g.

	foolib-4.13

would be release 4, patchlevel 13 of the foolib package.  Your editor
finds revision numbers like 5.004_03 or 0.99.6 too cryptic to be useful
to anyone but the packages' authors, and suspects that many of his
colleagues feel the same way.  Your editor feels he has suddenly
started writing like Miss Manners and needs to stop.  Now.


Q. Is there a way to provide pointers to new version of packages?

A. The answer to this one -- in the case of freeware packages, like
the ones that comprise Linux, comes from Håvard Lygre:

	"I am running RedHat Linux on one of my servers, and see the
	need for upgrading the software from time to time (especially 
	as I am using development kernels, which need newer versions of a lot 
	of the packages).   However, a lot of the time,  _none_ of the files  
	included says anything about where new versions of the software can be
	downloaded.

	As an example, I will use the net-tools package for linux.
	This package contains programs like route, ifconfig, hostname etc.
	I have previously downloaded a net-tools package, however, with the
	development of new kernels, there was a need for the newest.
	However, in _none_ of the README, INSTALL etc. files in the source
	tree of the previous net-tools package, was there an ftp or http  
	address.  There was the e-mail address of the author/maintainer,  
	but that's not the kind of questions you like to be bothered with when
	you are a developer!  Of course, I was able to find the package after 
	doing a search, but that should really not be necessary.  When
	the package provides README's INSTALL's etc., there should also be an
	URL of where you can get the newest version."

My comment?  Yes, that would be awfully handy.  An option like "-u"
for "emit the URL where this package can be found" would be very nice.
On the other hand, web locations for packages change so often that
it could also become a maintenance nightmare for the developer.

So I think that this *might* work if we all agree that the URL that's
embedded is the one of the (primary) site where the software package
could be found *as of the time it was downloaded*.  In other words,
the URL given is understood to be "where I came from" which might
not be the same as "where I can be found today".

Comments, anybody?


Q. Whew!  Anything else?

A. Oh my yes.  I'm sure that while you're reading this my mailbox
is filling up with comments.  But you'll have to wait until the
next revision to read them. :-)


Q. Did you do this by yourself?

A. Oh my no.  Among the people who have helped with comments and fixes
and things that I needed to think about in earlier revisions are:
Chris Siebenmann, Alan Rollow, Jonathan Spangler, Mark C. Henderson,
Timothy J. Lee, Pete Forman, Paul D. Smith, Greg Lindahl, Peter da Silva,
Frank da Cruz, D. J. Bernstein, Harald Kirsch, Ralf Fassel,
Wim Vandeputte, Håvard Lygre.
.

If there's any usefulness in this document, it's because of their help.
The mistakes are still my fault, though. ;-)


---------------------------------------------------------------------
| NOTE: The following four appendices list common names for         |
| configuration files, environment variables, file suffixes, and    |
| file names.  I'm well aware that they're incomplete.  Additions   |
| are quite welcome.                                                |
---------------------------------------------------------------------


Appendix I: Configuration Files/Directories


A number of UNIX programs utilize configuration files
(or "dot files", so called because their names usually
begin with a .) to customize their behavior.
These files usually are located in a user's home (login)
directory; some of them (and their purpose) are given below.

Note that some applications have taken to using "dot directories"
because they have so much information to store -- often including
state information that persists between instantiations of the
application -- that it would clutter up the user's home directory.
So intead it winds up in a subdirectory; for example, Netscape's
web browser likes to keep things in ".netscape".

Application developers shouldn't necessarily count on these
being present -- but may use them if they are.  They certainly
shouldn't name their own files in conflict with these names; and they
should avoid modifying these files if at all possible.


.acrorc, .acrosrch		
Used by Adobe Acrobat PDF reader.

.Arena
Used by the Arena web browser

.article
Location of saved (posted) articles; used by Pnews.

.bash_profile
.bashrc
Startup information for GNU bash shell.

.bash_history
Command history for GNU bash shell.

.bookmarks
Used by Sun's AnswerBook applications.

.cshrc
Initialization for instances of csh.

.dbxinit
Startup commands and aliases for the dbx debugger.

.dddinit
Startup commands and aliases for the ddd debugger.

.desksetdefaults
Startup options for Sun deskset tools.

.dtprofile
Startup for CDE on Solaris.

.elmrc
Initialization for the Elm mail client.

.errorrc
Functions for error to ignore.

.exrc
Initialization and macros for vi, edit, ex and view.

.fetchmailrc
Configuration information for the fetchmail POP/IMAP client.

.forward
Forwarding address for incoming mail, or the name of a
program to which incoming mail should be sent.

.gimp
.gimprc
Used by the GNU Image Manipulation Program.

.gnupg
GNU implementation of PGP.

.gopherc
Start up info for gopher clients.

.history
Saved command history across login sessions (csh).

.hostaliases
Shorthand names for hosts.

.hushlogin
Suppress printing of /etc/motd on login.

.indent.pro
Initialization for indent.

.ircrc
Startup of ircII

.kermrc
Standard Kermit initialization file

.learnrc
Used by learn to mark progress.

.less
.lessrc
Used by the "less" paginator.

.letter
Location of saved (sent) letters; used by Pnews, rn, tin.

.lisprc
Initialization for Franz Liszt (lisp) sessions.

.lynrc
Initialization for the Lynx web browser.

.login
Initialization for csh login sessions.

.logout
Commands to execute at end of csh login sessions.

.mailcap
MIME definitions used by various applications

.mailrc
Berkeley mailer options and aliases (Mail).

.mh_profile
MH mailer options.

.mhrc
MH mailer aliases.

.muttrc
Initialization for the mutt mail client.

.mykermrc
Personal Kermit customization file

.newsrc
News articles read; used by rn, vnews and readnews.

.netrc
Remote login initialization for ftp.

.netscape
.netscape-bookmarks.html
Used by Netscape web browser

.openwin-init
Startup info for Sun's OpenWindows.

.openwin-menu
Menu for Sun's OpenWindows.

.pinerc
Used by the "pine" mail client.

.plan
User's planned absences, contact information, etc.; printed by finger.

.pnewsexpert
Used by Pnews to track user expertise.

.procmailrc
Initialization and configuration for the procmail mail filter.

.profile
Initialization for login sessions using sh.

.project
User's current work area (project); used by finger.

.qmail
Used by the QMAIL mail package.

.raplayer
.raplayer30
Used by the RealAudio player.

.rhosts
List of pairs of login names/machine names allowed access to
this account without a password via rlogin, rsh, and rcp.

.signature
User's signature and electronic address; appended by postnews and Pnews.

.smrc
Used by Peter da Silva's Session Manager tool.

.ssh
Used by the "secure shell".

.rnhead, .rnlast, .rnlock, .rnmac, .rnsoft
Used by various versions of rn/trn/strn news-reading software.

.tcl  
Tool Command Language script.

.tin
Startup file for the "tin" news-reading client.

.tiprc
Used by cu, tip.

.tgz
Gzipped archive created by gnutar.

.tkman
Used by the tkman program (TK interface to manual pages).

.vimrc
Used by "vim", an implementation of the vi editor.

.workmanrc, .workmandb
Configuration and database for the Workman audio CD player.

.Xauthority
Used for security by X window system.

.Xdefaults
Configuration info for X window systems and X applications.

.xinitrc
Startup information for the X window system.



Appendix II: Environment Variables

An array of strings called the environment is made available
to each process started by Unix.  These strings are used to provide
information such as terminal type, default editor, preferred mailer,
and so on.  Most users set their environment in either .login (if they
use csh) or .profile (if they use sh).

Some common environment variables:

ABHOME
Sun's AnswerBook.

ATTRIBUTION
Format of attribution line in quoted article (rn/trn/xrn)

AUTHORCOPY
Where Pnews saves posted articles.

BIN
Number to be placed on the top of printer listings.

CANCELHEADER
Format of file to pass to CANCEL (rn/trn/xrn)

DOTDIR
Location of news-related files; used by rn/trn/xrn, Pnews, Rnmail.

EDITOR
User's preferred editor.

EXINIT
Startup commands read by ex, edit, view and vi.

FIRSTLINE
Format of first line of article displayed (rn/trn/xrn)

GR_HOME
Location of librariers for xmgr/xvgr data visualization tools.

GS_LIB
GNU ghostscript library directory.

HELPDIR
Help files for X windows applications

HIDELINE
Regular expression describing article lines to suppress (rn/trn/xrn)

HOME
User's home (login) directory.

HOSTALIASES
Location of .hostaliases file

HTTP_PROXY
Used by various web browsers to give host/port for HTTP proxy services.

INSTALL
Flags to initialize install.

KILLGLOBAL
Location of global kill file (rn/trn/xrn)

KILLLOCAL
Location of per-newsgroup kill file(s) (rn/trn/xrn)

LD_LIBRARY_PATH
Path to search for dynamically loadable libraries.

LESS
Flags to provide to the GNU "less" pager.

MAIL
Location of incoming mail.

MAILER
Default mailing program to use.

MAILCALL
What to say when there is new mail. (rn/trn/xrn)

MAILFILE
Where to check for mail. (rn/trn/xrn)

MAILHEADER
The format of the header file for replies. (rn/trn/xrn)

MAILPOSTER
Shell command used by reply (via mail) command (rn/trn/xrn)

MAILRECORD
Saved (sent) mail (Rnmail)

MANPATH
Path to search for manual pages.

MBOXSAVER
The shell command to save an article in mailbox format. (rn/trn/xrn)

MORE
Flags to provide to the "more" pager.

MOZILLA_HOME
Netscape's installed location.

NAME
User's real name.

NEWSHEADER
The format of the header file for followups. (rn/trn/xrn)

NEWSPOSTER
The shell command to be used by the followup commands (rn/trn/xrn)

NEWSRC
Location of news control file.

NNTPSERVER
Name/IP address of host providing NNTP services.

NORMSAVER
The shell command to save an article in the normal format (rn/trn/xrn)

OPENWINHOME
Sun, installation directory of OpenWindows.

ORGANIZATION
User's organization; used by Mail and news programs.

PAGER
User's preferred pagination (terminal file display) program.

PAGESTOP
Regular expression matching lines as page breaks (rn/trn/xrn)

	Are you beginning to get the idea that maybe rn/trn/xrn got
	just a little carried away with environment variables?

PATH
The sequence of directory prefixes that sh, csh, etc.,
apply in searching for a file known by an incomplete path name.
The prefixes are separated by : for sh, and
by spaces for csh.

PERLLIB
Perl library directory.

PIPESAVER
Shell command to save via a pipe. (rn/trn/xrn)

PRINTER
User's default printer.

RNINIT
Initialization string for rn.

RNMACRO
Location of files with macros and key maps. (rn/trn/xrn)

SAVEDIR
Directory for saved news articles from rn/trn/xrn.

SAVENAME
The name of the file to save to, if unspecified (rn/trn/xrn).

SHELL
The file name of the user's login shell.

SUBJLINE
Controls the format of lines displayed by "=" (rn/trn/xrn).

TERM
Terminal type for which output is to be prepared.

TERMINFO
Location of the terminfo directory (System V curses).

TERMCAP
The string describing the terminal in TERM,
or the name of the termcap file (Berkeley curses).

TRNINIT
Initialization string for trn.

USER
The login name of the user.

VISUAL
Preferred screen editor; used by mail and news programs.

WORKMANDB
Location of data files for Workman CD player application.

WWW_HOME ~/web/home.html
Starting document for web browsers.

XAPPLRESDIR [DEPRECATED]
Replaced by XFILESEARCHPATH and XUSERFILESEARCHPATH.

XFILESEARCHPATH
Colon-separated list of directories to search for
system X resource files.
Can contain special tokens to facilitate i18n support.

XUSERFILESEARCHPATH
Colon-separated list of directories to search
for user-specific X resource files.
Can contain special tokens to facilitate i18n support.

YOUSAID
Format of attribution line in front of the quoted article (rn/trn/xrn).


Appendix III: File Suffix Conventions

Although UNIX allows users to store data and text in files
of practically any name, certain conventions have evolved
over the years.  Here is a quick list of the suffixes most often
encountered:

.a
Archive (ar) file.

.awk
Awk script.

.bib
Bibliographic data file.

.c
C source.

.cc
C++ source

.dvi
Device-independent text formatter output.

.f
Fortran (f77) source.

.h
Source code include file, usually C.

.html
HTML document

.ksc
Kermit script

.l
Lisp source; Lex source.

.me
Nroff/troff source using -me macros.

.mm
Nroff/troff source using -mm macros.

.ms
Nroff/troff source using -ms macros.

.n
Nroff source.

.o
Object (as output).

.p
Pascal source; Prolog source.

.pl
Perl program.

.s
Assembler (as) source.

.sh
Bourne (sh) shell script.

.tar
Archive created by tar.

.tex
TeX source.

.txt   
A plain text file

,v
RCS delta file.

.w
A Wart preprocessor file (similar to Lex).

.y
Yacc source.

.Z
Compressed file.

.cf
configuration file, as in sendmail.cf

.z
packed file

.gz
gzipped file

.zip
zipped file

.C
C++ source, or compacted file (obsolete)



Appendix IV: File Name Conventions


Although UNIX allows users to store data and text in files
of practically any name, certain conventions have evolved
over the years.  Here is a quick list of the filenames most often
encountered, and what they're used by:

a.out
Default name of executable files produced by cc,
f77, pc, ld, and other compilers and loaders.

calendar
Location of user's schedule; used by calendar.

Configure
A shell script found in the top-level directory of software
distributions.  Usually refers to a Larry Wall-style interactive
configure, whose first appearance (I think) was in "rn".

configure
A shell script found in the top-level directory of software
distributions.  Usually refers to a GNU-style non-interactive
configure, found in things like "gcc".

core
*.core
core.*
Created by Unix when a program attempts an illegal operation;
useful with adb, dbx, gcore and pxp.  (More recent Unixes tend
toward the latter two forms.)

dead.article
Used by Pnews and postnews for interrupted articles.

dead.letter
Used by Mail and mail for interrupted letters.

gmon.out
Profiling information; used by gprof.

Imakefile
A meta-makefile which is used to create Makefiles via tools
such as xmkmf.

lex.yy.c
Output file from lex.

Makefile, makefile
Standard name for make command file.  See also cc.

mbox
Used by Mail and mail as default mailbox.

mon.out
Profiling information; see prof.

nohup.out
Output from background commands after logout; see nohup, sh, and csh.

strings
Quoted strings file from xstr.

tags
Function references in C source;
created by ctags and used by vi, ex, edit, and view.

typescript
Default name for script output.

xs.c
C source created by xstr.

y.output, y.tab.h, y.tab.c
Various yacc output files.

Administrivia:

	I receive an average of hundreds of mail messages per day.  If you
	want to make sure that your update/correction/reply to this
	article comes to my attention when I'm working on the next
	version, please send your message as a reply to this article,
	i.e. make absolutely certain that you preserve the "Subject:"
	line.  If you don't do this, your reply may sit in one of my
	numerous mail queues for months or even years.

	Please don't send an update more than once -- doing so only
	adds to the queue that I have to process when doing updates.
	If you want to make certain that I've received something, then
	make a note of the information on the "Version:" line above.
	If it has changed when you next see this article, and your
	information isn't included, then I've missed it.  Otherwise,
	it's safe to presume I've got it and it's queued for inclusion.

	The FAQ may be reproduced and propagated via http, ftp, gopher
	or other common Internet protocols by anyone provided that (1)
	it is reproduced in its entirety (2) no fee is charged for access
	to it and (3) it's kept up-to-date.  This latter is probably best
	accomplished by mirroring one of the FAQ archives -- that way
	you'll get a new copy everytime I update it, which is
	approximately monthly.   (If you do put it up on the web, I'd
	like to know the URL, but that's not a requirement.  It just
	would be nice.)

	Reproduction of this FAQ on paper, CDROM or other media which
	are sold is permissible only with the express written consent
	of its author.

	If you are reading a copy of this document which appears to be
	out-of-date, there are a variety of methods that you can use to
	retrieve the most current method.  If you are familiar with access
	to the FAQ archives via mail, ftp, and www, then you already know how.
	If not,	 then send email to mail-server@rtfm.mit.edu with the command
	"send usenet/news.answers/news-answers/introduction" in the message,
	and a complete guide to FAQ retrieval will be mailed to you.

Copyright Rich Kulawiec, 1997, 1998, 1999.

User Contributions:

Comment about this article, ask questions, or add new information about this topic:

CAPTCHA


[ Usenet FAQs | Web FAQs | Documents | RFC Index ]

Send corrections/additions to the FAQ Maintainer:
rsk@gsp.org





Last Update March 27 2014 @ 02:12 PM