📄 ch21_03.htm
字号:
<HTML><!--Distributed by F --><HEAD><TITLE>[Chapter 21] 21.3 Unique Names for Temporary Files </TITLE><METANAME="DC.title"CONTENT="UNIX Power Tools"><METANAME="DC.creator"CONTENT="Jerry Peek, Tim O'Reilly & Mike Loukides"><METANAME="DC.publisher"CONTENT="O'Reilly & Associates, Inc."><METANAME="DC.date"CONTENT="1998-08-04T21:40:00Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-260-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch21_01.htm"TITLE="21. More About Managing Files"><LINKREL="prev"HREF="ch21_02.htm"TITLE="21.2 A Better Place for Temporary Files: /tmp "><LINKREL="next"HREF="ch21_04.htm"TITLE="21.4 Why Both /tmp and /usr/tmp? "></HEAD><BODYBGCOLOR="#FFFFFF"TEXT="#000000"><DIVCLASS="htmlnav"><H1><IMGSRC="gifs/smbanner.gif"ALT="UNIX Power Tools"USEMAP="#srchmap"BORDER="0"></H1><MAPNAME="srchmap"><AREASHAPE="RECT"COORDS="0,0,466,58"HREF="index.htm"ALT="UNIX Power Tools"><AREASHAPE="RECT"COORDS="467,0,514,18"HREF="jobjects/fsearch.htm"ALT="Search this book"></MAP><TABLEWIDTH="515"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch21_02.htm"TITLE="21.2 A Better Place for Temporary Files: /tmp "><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT="Previous: 21.2 A Better Place for Temporary Files: /tmp "BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1">Chapter 21<BR>More About Managing Files</FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch21_04.htm"TITLE="21.4 Why Both /tmp and /usr/tmp? "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 21.4 Why Both /tmp and /usr/tmp? "BORDER="0"></A></TD></TR></TABLE> <HRALIGN="LEFT"WIDTH="515"TITLE="footer"></DIV><DIVCLASS="SECT1"><H2CLASS="sect1"><ACLASS="title"NAME="UPT-ART-5180">21.3 Unique Names for Temporary Files </A></H2><PCLASS="para"><ACLASS="indexterm"NAME="AUTOID-22965"></A><ACLASS="indexterm"NAME="AUTOID-22968"></A><ACLASS="indexterm"NAME="AUTOID-22972"></A>All users share <SPANCLASS="link"><EMCLASS="emphasis">/tmp</EM> (<ACLASS="linkend"HREF="ch21_02.htm"TITLE="A Better Place for Temporary Files: /tmp ">21.2</A>)</SPAN>,so you should make unique filenames there.The best way to do this is by putting <CODECLASS="literal">$$</CODE> in the filename.For example:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">% <CODECLASS="userinput"><B>vi /tmp/jerry.$$</B></CODE>"/tmp/jerry.12345" [New file]% <CODECLASS="userinput"><B>lpr /tmp/jerry.$$</B></CODE>% <CODECLASS="userinput"><B>rm /tmp/jerry.$$</B></CODE></PRE></BLOCKQUOTE></P><PCLASS="para">The shell replaces <CODECLASS="literal">$$</CODE> with the shell's<SPANCLASS="link">PID number (<ACLASS="linkend"HREF="ch38_03.htm"TITLE="Managing Processes: Overall Concepts ">38.3</A>)</SPAN>(in this case, <CODECLASS="literal">12345</CODE>).</P><PCLASS="para">If you use a<SPANCLASS="link">subshell (<ACLASS="linkend"HREF="ch38_04.htm"TITLE="Subshells ">38.4</A>)</SPAN>,or have more than one login session or window,and want to share the same temp file, <CODECLASS="literal">$$</CODE> won't work for you.In that case, just pick a unique name.You could use today's date instead.</P><PCLASS="para">To give yourself both options with a minimum of work,here are lines for your<SPANCLASS="link">shell setup files (<ACLASS="linkend"HREF="ch02_02.htm"TITLE="Shell Setup Files-Which, Where, and Why ">2.2</A>)</SPAN>.The left column has lines for <EMCLASS="emphasis">csh</EM>-like shells, and theright is for <EMCLASS="emphasis">sh</EM>-like shells. </P><PCLASS="para"><TABLECLASS="screen.co"BORDER="1"><TR><THVALIGN="TOP"><PRECLASS="calloutlist"> <ACLASS="co"HREF="ch09_16.htm"TITLE="9.16 Command Substitution ">`...`</A> <ACLASS="co"HREF="ch47_05.htm"TITLE="47.5 Using C Shell Arrays ">[n]</A> </PRE></TH><TDVALIGN="TOP"><PRECLASS="screen"><EMCLASS="emphasis">.cshrc:</EM> <EMCLASS="emphasis">.profile</EM>:set tf=/tmp/jp$$ tf=/tmp/jp$$<EMCLASS="emphasis">.login:</EM> export TFset date = (`date`) set `date`setenv TF /tmp/jp$date[4] TF=/tmp/jp$4</PRE></TD></TR></TABLE></P><PCLASS="para"> (The last two lines grab the fourth word - the current time - from theoutput of the<SPANCLASS="link"><EMCLASS="emphasis">date</EM> (<ACLASS="linkend"HREF="ch51_10.htm"TITLE="The date Command ">51.10</A>)</SPAN>command.)When I want a temporary file in my current shell, I type: </P><PCLASS="para"><TABLECLASS="screen.co"BORDER="1"><TR><THVALIGN="TOP"><PRECLASS="calloutlist"> <ACLASS="co"HREF="ch15_02.htm"TITLE="15.2 Filename Wildcards in a Nutshell ">*</A> </PRE></TH><TDVALIGN="TOP"><PRECLASS="screen">% <CODECLASS="userinput"><B>grep foo bar > $tf-1</B></CODE>% <CODECLASS="userinput"><B>grep wheeze bar > $tf-2</B></CODE>% <CODECLASS="userinput"><B>more $tf-*</B></CODE></PRE></TD></TR></TABLE></P><PCLASS="para"> The shell expands the<SPANCLASS="link">shell variable (<ACLASS="linkend"HREF="ch06_08.htm"TITLE="Shell Variables ">6.8</A>)</SPAN><CODECLASS="literal">$tf-1</CODE> into a filename like <CODECLASS="literal">/tmp/jp2345-1</CODE>, and<CODECLASS="literal">$tf-*</CODE> 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 <CODECLASS="literal">$tf</CODE> won't be thesame as the ones I make in my login shell because the PIDs aredifferent. If I need them to be the same, I use <CODECLASS="literal">$TF</CODE>, the<SPANCLASS="link">environment variable (<ACLASS="linkend"HREF="ch06_01.htm#UPT-ART-1170"TITLE="What Environment Variables Are Good For ">6.1</A>)</SPAN>.It's set to the time I logged in.And because environment variables are passed to child shells, the name(like <EMCLASS="emphasis">/tmp/jp09:34:56</EM>) will be the same in subshells: </P><PCLASS="para"><TABLECLASS="screen.co"BORDER="1"><TR><THVALIGN="TOP"><PRECLASS="calloutlist"> <ACLASS="co"HREF="ch15_02.htm"TITLE="15.2 Filename Wildcards in a Nutshell ">[..]</A> </PRE></TH><TDVALIGN="TOP"><PRECLASS="screen">% <CODECLASS="userinput"><B>someprog > $TF-1</B></CODE>...% <CODECLASS="userinput"><B>otherprog > $TF-6</B></CODE>% <CODECLASS="userinput"><B>sh</B></CODE>$ <CODECLASS="userinput"><B>head $TF-[16]</B></CODE></PRE></TD></TR></TABLE></P><PCLASS="para"> If I'll be using a file for more than a minute or two, I might forgetwhat's in which file.So I leave myself a note in shell variables named <CODECLASS="literal">xf</CODE><CODECLASS="replaceable"><I>n</I></CODE>and environment variables named <CODECLASS="literal">XF</CODE><CODECLASS="replaceable"><I>n</I></CODE>-where "xf" means"explain file" and <CODECLASS="replaceable"><I>n</I></CODE> is<EMCLASS="emphasis">1</EM>, <EMCLASS="emphasis">2</EM>, etc. to correspond to the variable.If I don't remember which have what, I get a list by piping the output of<EMCLASS="emphasis">set</EM> (for shell variables) or<SPANCLASS="link"><EMCLASS="emphasis">printenv</EM> or <EMCLASS="emphasis">env</EM> (<ACLASS="linkend"HREF="ch06_01.htm#UPT-ART-1170"TITLE="What Environment Variables Are Good For ">6.1</A>)</SPAN>(for environment variables) through <EMCLASS="emphasis">grep</EM>.For example:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">% <CODECLASS="userinput"><B>sort -t: +2 $tf-2 > $tf-3</B></CODE>% <CODECLASS="userinput"><B>set xf3='sorted list of chapter 21 files'</B></CODE> <ICLASS="lineannotation">...later...</I>% <CODECLASS="userinput"><B>set | grep xf</B></CODE>xf1 sorted list of chapter 20 filesxf3 sorted list of chapter 21 files% <CODECLASS="userinput"><B>lpr $tf-3</B></CODE></PRE></BLOCKQUOTE></P><TABLECLASS="para.programreference"BORDER="1"><TR><THVALIGN="TOP"><ACLASS="programreference"HREF="examples/index.htm"TITLE="csh_logout">csh_logout</A><BR><ACLASS="programreference"HREF="examples/index.htm"TITLE="sh_logout">sh_logout</A><BR></TH><TDVALIGN="TOP"> To clean up when I log out, I added the lines that follow to the C shell<EMCLASS="emphasis">.logout</EM> file.The Bourne shell version is similar, but it needs a couple of tricksto work on some shells; it's on the CD-ROM.</TD></TR></TABLE><PCLASS="para"><TABLECLASS="screen.co"BORDER="1"><TR><THVALIGN="TOP"><PRECLASS="calloutlist"> <ACLASS="co"HREF="ch15_04.htm"TITLE="15.4 What if a Wildcard Doesn't Match? ">nonomatch</A> <ACLASS="co"HREF="ch16_08.htm"TITLE="16.8 The ls -d Option ">-d</A> <ACLASS="co"HREF="ch13_05.htm"TITLE="13.5 Redirection in C Shell: Capture Errors, Too? ">|&</A> <ACLASS="co"HREF="ch09_11.htm"TITLE="9.11 Repeating a Command with a foreach Loop ">$<</A> <ACLASS="co"HREF="ch47_04.htm"TITLE="47.4 C Shell Variable Operators and Expressions ">=~</A> </PRE></TH><TDVALIGN="TOP"><PRECLASS="screen"># CLEAN FILES (IF ANY) OUT OF /tmp:set nonomatchset 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 $tmpfendif</PRE></TD></TR></TABLE></P><PCLASS="para">If I made any temporary files from my login shell or any subshells,I get this message when I log out:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">% <CODECLASS="userinput"><B>logout</B></CODE>Your files in /tmp:/tmp/jp2345-1 /tmp/jp2345-2 /tmp/jp2748-1 /tmp/09:23:45-1'rm -rf' them? <CODECLASS="userinput"><B>y</B></CODE></PRE></BLOCKQUOTE></P><PCLASS="para">Another way to do this is with a script like<SPANCLASS="link"><EMCLASS="emphasis">del</EM> (<ACLASS="linkend"HREF="ch23_06.htm"TITLE="A Faster Way to Remove Files Interactively ">23.6</A>)</SPAN>.</P><DIVCLASS="sect1info"><PCLASS="SECT1INFO">- <SPANCLASS="authorinitials">JP</SPAN></P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="515"TITLE="footer"><TABLEWIDTH="515"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch21_02.htm"TITLE="21.2 A Better Place for Temporary Files: /tmp "><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT="Previous: 21.2 A Better Place for Temporary Files: /tmp "BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><ACLASS="book"HREF="index.htm"TITLE="UNIX Power Tools"><IMGSRC="gifs/txthome.gif"SRC="gifs/txthome.gif"ALT="UNIX Power Tools"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch21_04.htm"TITLE="21.4 Why Both /tmp and /usr/tmp? "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 21.4 Why Both /tmp and /usr/tmp? "BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172">21.2 A Better Place for Temporary Files: /tmp </TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><ACLASS="index"HREF="index/idx_0.htm"TITLE="Book Index"><IMGSRC="gifs/index.gif"SRC="gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172">21.4 Why Both /tmp and /usr/tmp? </TD></TR></TABLE><HRALIGN="LEFT"WIDTH="515"TITLE="footer"><IMGSRC="gifs/smnavbar.gif"SRC="gifs/smnavbar.gif"USEMAP="#map"BORDER="0"ALT="The UNIX CD Bookshelf Navigation"><MAPNAME="map"><AREASHAPE="RECT"COORDS="0,0,73,21"HREF="../index.htm"ALT="The UNIX CD Bookshelf"><AREASHAPE="RECT"COORDS="74,0,163,21"HREF="index.htm"ALT="UNIX Power Tools"><AREASHAPE="RECT"COORDS="164,0,257,21"HREF="../unixnut/index.htm"ALT="UNIX in a Nutshell"><AREASHAPE="RECT"COORDS="258,0,321,21"HREF="../vi/index.htm"ALT="Learning the vi Editor"><AREASHAPE="RECT"COORDS="322,0,378,21"HREF="../sedawk/index.htm"ALT="sed & awk"><AREASHAPE="RECT"COORDS="379,0,438,21"HREF="../ksh/index.htm"ALT="Learning the Korn Shell"><AREASHAPE="RECT"COORDS="439,0,514,21"HREF="../lrnunix/index.htm"ALT="Learning the UNIX Operating System"></MAP></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -