All users share
/tmp
(21.2
)
,
so you should make unique filenames there.
The best way to do this is by putting $$
in the filename.
For example:
% vi /tmp/jerry.$$
"/tmp/jerry.12345" [New file]
% lpr /tmp/jerry.$$
% rm /tmp/jerry.$$
The shell replaces $$
with the shell's
PID number (38.3
)
(in this case, 12345
).
If you use a
subshell (38.4
)
,
or have more than one login session or window,
and want to share the same temp file, $$
won't work for you.
In that case, just pick a unique name.
You could use today's date instead.
To give yourself both options with a minimum of work,
here are lines for your
shell setup files (2.2
)
.
The left column has lines for csh
-like shells, and the
right is for sh
-like shells.
`...`
[n]
|
.cshrc:
.profile
:
set tf=/tmp/jp$$ tf=/tmp/jp$$
.login:
export TF
set date = (`date`) set `date`
setenv TF /tmp/jp$date[4] TF=/tmp/jp$4
|
(The last two lines grab the fourth word - the current time - from the
output of the
date
(51.10
)
command.)
When I want a temporary file in my current shell, I type:
*
|
% grep foo bar > $tf-1
% grep wheeze bar > $tf-2
% more $tf-*
|
The shell expands the
shell variable (6.8
)
$tf-1
into a filename like /tmp/jp2345-1
, and
$tf-*
expands into all my temporary files in this shell.
Usually, that's great. But if I go to a subshell, do a shell escape,
and so on, the temporary files I make with $tf
won't be the
same as the ones I make in my login shell because the PIDs are
different. If I need them to be the same, I use $TF
, the
environment variable (6.1
)
.
It's set to the time I logged in.
And because environment variables are passed to child shells, the name
(like /tmp/jp09:34:56
) will be the same in subshells:
[..]
|
% someprog > $TF-1
...
% otherprog > $TF-6
% sh
$ head $TF-[16]
|
If I'll be using a file for more than a minute or two, I might forget
what's in which file.
So I leave myself a note in shell variables named xf
n
and environment variables named XF
n
-where "xf" means
"explain file" and n
is
1
, 2
, etc. to correspond to the variable.
If I don't remember which have what, I get a list by piping the output of
set
(for shell variables) or
printenv
or env
(6.1
)
(for environment variables) through grep
.
For example:
% sort -t: +2 $tf-2 > $tf-3
% set xf3='sorted list of chapter 21 files'
...later...
% set | grep xf
xf1 sorted list of chapter 20 files
xf3 sorted list of chapter 21 files
% lpr $tf-3
csh_logout
sh_logout
|
To clean up when I log out, I added the lines that follow to the C shell
.logout
file.
The Bourne shell version is similar, but it needs a couple of tricks
to work on some shells; it's on the CD-ROM. |
nonomatch
-d
|&
$<
=~
|
# CLEAN FILES (IF ANY) OUT OF /tmp:
set nonomatch
set tmpf="\`ls -d $tf-* $TF-* |& grep -v ' not found'\`"
if ( "$tmpf" =~ ?* ) then
echo; echo "Your files in /tmp:"
ls -d $tmpf
echo -n "'rm -rf' them? [ny](n) "
if ( "$<" =~ y* ) rm -rf $tmpf
endif
|
If I made any temporary files from my login shell or any subshells,
I get this message when I log out:
% logout
Your files in /tmp:
/tmp/jp2345-1 /tmp/jp2345-2 /tmp/jp2748-1 /tmp/09:23:45-1
'rm -rf' them? y
Another way to do this is with a script like
del
(23.6
)
.