Unix FAQs

Horizontal Rule [Mar 98]

Sandie Hui

 

Q. How do I construct a shell glob-pattern that matches all files except "." and ".." ?

A. 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; 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 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" .

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 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.

In ksh, you can use: .!(.|) *

Q. How do I tell inside .cshrc if I’m a login shell?

A. 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 "$$". Login shells generally have names that begin with a ‘-’. 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


[Issue No. 14]


[u logo]
Computing Services Centre
City University of Hong Kong
ccnetcom@cityu.edu.hk

[Home Page][CSC Home][NetComp Home][Content Home][Previous Page][Next Page]