📄 ch45_04.htm
字号:
<HTML><!--Distributed by F --><HEAD><TITLE>[Chapter 45] 45.4 Fun with #! </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:54:22Z"><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="ch45_01.htm"TITLE="45. Shell Programming for the Initiated"><LINKREL="prev"HREF="ch45_03.htm"TITLE="45.3 Don't Need a Shell for Your Script? Don't Use One "><LINKREL="next"HREF="ch45_05.htm"TITLE="45.5 A File That Shows Itself... and What #! Does "></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="ch45_03.htm"TITLE="45.3 Don't Need a Shell for Your Script? Don't Use One "><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT="Previous: 45.3 Don't Need a Shell for Your Script? Don't Use One "BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1">Chapter 45<BR>Shell Programming for the Initiated</FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch45_05.htm"TITLE="45.5 A File That Shows Itself... and What #! Does "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 45.5 A File That Shows Itself... and What #! Does "BORDER="0"></A></TD></TR></TABLE> <HRALIGN="LEFT"WIDTH="515"TITLE="footer"></DIV><DIVCLASS="SECT1"><H2CLASS="sect1"><ACLASS="title"NAME="UPT-ART-7880">45.4 Fun with #! </A></H2><PCLASS="para"><ACLASS="indexterm"NAME="AUTOID-52359"></A><ACLASS="indexterm"NAME="AUTOID-52363"></A><ACLASS="indexterm"NAME="AUTOID-52367"></A><ACLASS="indexterm"NAME="AUTOID-52370"></A><ACLASS="indexterm"NAME="AUTOID-52373"></A>[You might think that the "magic" characters <CODECLASS="literal">#!</CODE> are onlyfor shell scripts.<SPANCLASS="link">Not true (<ACLASS="linkend"HREF="ch45_05.htm"TITLE="A File That Shows Itself... and What #! Does ">45.5</A>, <ACLASS="linkend"HREF="ch45_03.htm"TITLE="Don't Need a Shell for Your Script? Don't Use One ">45.3</A>)</SPAN>!Here are some fun examples.Study them and (if your UNIX system understands <CODECLASS="literal">#!</CODE>) try them; I hopethey'll help you see what <CODECLASS="literal">#!</CODE> really does. -JP]</P><DIVCLASS="msgset"><DIVCLASS="msgentry"><DIVCLASS="msg"><DIVCLASS="msgtext"><PCLASS="para"><BCLASS="msgentry.role">Q:</B> Why begin a shell scriptwith <CODECLASS="literal">#!/bin/sh</CODE> or <CODECLASS="literal">#!/bin/csh</CODE>?</P></DIV></DIV></DIV><DIVCLASS="msgentry"><DIVCLASS="msg"><DIVCLASS="msgtext"><PCLASS="para"><BCLASS="msgentry.role">A:</B> Under some systems - principallythose with Berkeley influence - thismakes the program directly executable. That is, the kernel canstart this program, even though it's not machine code; the kernel willinvoke the named program after fiddling arguments a bit.</P></DIV></DIV></DIV></DIV><PCLASS="para">In fact, the script:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">#! /bin/mv</PRE></BLOCKQUOTE></P><PCLASS="para">will rename itself. Place it in a file called <EMCLASS="emphasis">zap</EM>,and type <CODECLASS="literal">zap zup</CODE>, and now you have a shell scriptcalled <EMCLASS="emphasis">zup</EM>. Your shell tried to <EMCLASS="emphasis">exec</EM> theprogram with the argument <CODECLASS="literal">zup</CODE>. This succeeded, but actuallyran <EMCLASS="emphasis">/bin/mv</EM> with the arguments <CODECLASS="literal">zap zup</CODE>.</P><PCLASS="para"><ACLASS="indexterm"NAME="AUTOID-52405"></A><ACLASS="indexterm"NAME="AUTOID-52408"></A><ACLASS="indexterm"NAME="AUTOID-52411"></A><ACLASS="indexterm"NAME="AUTOID-52414"></A><ACLASS="indexterm"NAME="AUTOID-52417"></A><ACLASS="indexterm"NAME="AUTOID-52420"></A><ACLASS="indexterm"NAME="AUTOID-52423"></A><ACLASS="indexterm"NAME="AUTOID-52426"></A>You can make self-removing scripts:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">#! /bin/rm</PRE></BLOCKQUOTE></P><PCLASS="para">Or self-printing scripts:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">#! /bin/awk NR>1{print}text...</PRE></BLOCKQUOTE></P><PCLASS="para">This last one works because the kernel is willing to do more thaninsert the filename in the argument list: it will insertan optional argument.Some systems allow only one such argument(which can then contain blanks),while others allow multiple blank (space or TAB) separated arguments.Note that, in the latter case,there is probably no way to embed blanks(the kernel is unlikely to provide shell-like quoting mechanisms);the safest course is to avoid them entirely.</P><PCLASS="para">Normally, this is used for things like the<EMCLASS="emphasis">-f</EM> option to the C shell ("fast", don't read <EMCLASS="emphasis">.cshrc</EM>s), but itworks well enough for <EMCLASS="emphasis">awk</EM> too.</P><PCLASS="para"><ACLASS="indexterm"NAME="AUTOID-52440"></A><ACLASS="indexterm"NAME="AUTOID-52442"></A><CODECLASS="literal">#!</CODE> is described, though not completely, in the <EMCLASS="emphasis">execve</EM>(2) manual page.Note that there may be a small limit on the number of characters in the<CODECLASS="literal">#!</CODE> line, typically 32.(32 is "magic" because it equals <CODECLASS="literal">sizeof(struct exec)</CODE>.)</P><DIVCLASS="sect1info"><PCLASS="SECT1INFO">- <SPANCLASS="authorinitials">CT</SPAN> <SPANCLASS="bibliomisc">in <ACLASS="systemitem.newsgroup"HREF="news:net.unix">net.unix</A> on Usenet, 29 December 1984</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="ch45_03.htm"TITLE="45.3 Don't Need a Shell for Your Script? Don't Use One "><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT="Previous: 45.3 Don't Need a Shell for Your Script? Don't Use One "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="ch45_05.htm"TITLE="45.5 A File That Shows Itself... and What #! Does "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 45.5 A File That Shows Itself... and What #! Does "BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172">45.3 Don't Need a Shell for Your Script? Don't Use One </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">45.5 A File That Shows Itself... and What #! Does </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 + -