Removing a File Once It's Opened - for Security and Easy Cleanup

Once a process has opened a file (), UNIX won't delete the file until the process closes it. (The rm command only removes a link to the file from a directory, not the file itself.)

I've heard arguments () about whether removing a file while it's open is a good idea. If you want to run a set of commands from a file, but not let anyone else read the list of commands you're using, you can write a shell script that removes itself before doing anything else. (You should be aware that if you use a filesystem mounted by NFS (), NFS will just rename the "removed" file to a hidden filename () like nfsXXXXX.)

Here's a simple self-removing shell script:

% cat doit rm doit # by now, shell has opened this file; we can remove it ls doit make bigprog ... % sh doit ls: doit not found cc -target sun4 -c routine.c ...

Here's a more typical script that opens and removes a file in /tmp ():

 exec <&- 
% cat delme #!/bin/sh temp=/tmp/delme$$ # file in /tmp (could be anywhere) echo "This is line1. This is line2. This is line3." > $temp # put three lines in $temp ls -l $temp; wc $temp # ls and count lines in the file exec < $temp # take standard input from $temp read line; echo $line # read and echo line 1 from $temp rm $temp; echo rm returned $? # remove $temp link; show status ls -l $temp; wc $temp # the file is gone...? read line; echo $line # but file is still open! read line; echo $line exec <&- # close standard input (and file) % delme -rw-rw-r-- 1 jerry 45 Sep 16 12:31 /tmp/delme22743 3 9 45 /tmp/delme22743 This is line1. rm returned 0 ls: /tmp/delme22743: No such file or directory wc: cannot open /tmp/delme22743 This is line2. This is line3.

- JP