Sandie Hui
Q. How do I construct a shell glob-pattern that matches all files except "." and ".." ?
A. Youd think this would be easy.
* | Matches all files that dont begin with a "."; |
.* | Matches all files that do begin with a ".", but this includes the special entries "." and "..", which often you dont 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 dont 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 Im a login shell?
A. When people ask this, they usually mean either
How can I tell if its an interactive shell? or
How can I tell if its 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 youre really interested in the other two questions, heres 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 wantelse# # This shell is a child of one of our other shells so # we dont need to set all the environment variables again. # set tmp = $CSHLEVEL @ tmp++ setenv CSHLEVEL $tmpendif# 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
Computing Services Centre City University of Hong Kong ccnetcom@cityu.edu.hk |