📄 autobook_212.html
字号:
<HTML><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><!-- Created on September, 12 2004 by texi2html 1.64 --><!-- Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) Karl Berry <karl@freefriends.org> Olaf Bachmann <obachman@mathematik.uni-kl.de> and many others.Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>Send bugs and suggestions to <texi2html@mathematik.uni-kl.de> --><HEAD><TITLE>Autoconf, Automake, and Libtool: Magic Numbers</TITLE><META NAME="description" CONTENT="Autoconf, Automake, and Libtool: Magic Numbers"><META NAME="keywords" CONTENT="Autoconf, Automake, and Libtool: Magic Numbers"><META NAME="resource-type" CONTENT="document"><META NAME="distribution" CONTENT="global"><META NAME="Generator" CONTENT="texi2html 1.64"><script language="Javascript"><!-- // Check the browser version. function checkVersion() { if (navigator.appVersion.charAt(0)>=3) return true; if (navigator.appVersion.charAt(0)>=4) return true; else return false; } if (checkVersion()) { homeon = new Image(); homeon.src = "homeon.png"; homeoff = new Image(); homeoff.src = "home.png"; tocon = new Image(); tocon.src = "tocon.png"; tocoff = new Image(); tocoff.src = "toc.png"; indexon = new Image(); indexon.src = "indexon.png"; indexoff = new Image(); indexoff.src = "index.png"; helpon = new Image(); helpon.src = "helpon.png"; helpoff = new Image(); helpoff.src = "help.png"; backon = new Image(); backon.src = "backon.png"; backoff = new Image(); backoff.src = "back.png"; forwardon = new Image(); forwardon.src = "forwardon.png"; forwardoff = new Image(); forwardoff.src = "forward.png"; prevon = new Image(); prevon.src = "prevon.png"; prevoff = new Image(); prevoff.src = "prev.png"; nexton = new Image(); nexton.src = "nexton.png"; nextoff = new Image(); nextoff.src = "next.png"; upon = new Image(); upon.src = "upon.png"; upoff = new Image(); upoff.src = "up.png"; } function img_act(imgName) { if (checkVersion()) { imgOn = eval(imgName + "on.src"); document [imgName].src = imgOn; } } function img_inact(imgName) { if (checkVersion()) { imgOff = eval(imgName + "off.src"); document [imgName].src = imgOff; } }// --></SCRIPT></HEAD><BODY LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#6688AA" VLINK="#336688" ALINK="#808080"><A NAME="SEC212"></A><TABLE BORDER=0 CELLPADDING=0 CELLSPACING=10><TR VALIGN="TOP"><TD ALIGN="MIDDLE" WIDTH=50 BGCOLOR="#e6e6e6"><TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_211.html#SEC211" onMouseover="img_act('prev')" onMouseout="img_inact('prev')"><IMG SRC="prev.png" BORDER="0" ALT="Back: Size Limitations" ALIGN="MIDDLE" NAME="prev"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_213.html#SEC213" onMouseover="img_act('next')" onMouseout="img_inact('next')"><IMG SRC="next.png" BORDER="0" ALT="Forward: Colon" ALIGN="MIDDLE" NAME="next"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"> <TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_213.html#SEC213" onMouseover="img_act('back')" onMouseout="img_inact('back')"><IMG SRC="back.png" BORDER="0" ALT="FastBack: Colon" ALIGN="MIDDLE" NAME="back"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_210.html#SEC210" onMouseover="img_act('up')" onMouseout="img_inact('up')"><IMG SRC="up.png" BORDER="0" ALT="Up: Sh Implementation" ALIGN="MIDDLE" NAME="up"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_219.html#SEC219" onMouseover="img_act('forward')" onMouseout="img_inact('forward')"><IMG SRC="forward.png" BORDER="0" ALT="FastForward: Environment" ALIGN="MIDDLE" NAME="forward"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook.html#SEC_Top" onMouseover="img_act('home')" onMouseout="img_inact('home')"><IMG SRC="home.png" BORDER="0" ALT="Top: Autoconf, Automake, and Libtool" ALIGN="MIDDLE" NAME="home"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_toc.html#SEC_Contents" onMouseover="img_act('toc')" onMouseout="img_inact('toc')"><IMG SRC="toc.png" BORDER="0" ALT="Contents: Table of Contents" ALIGN="MIDDLE" NAME="toc"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_285.html#SEC285" onMouseover="img_act('index')" onMouseout="img_inact('index')"><IMG SRC="index.png" BORDER="0" ALT="Index: Index" ALIGN="MIDDLE" NAME="index"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_abt.html#SEC_About" onMouseover="img_act('help')" onMouseout="img_inact('help')"><IMG SRC="help.png" BORDER="0" ALT="About: About this document" ALIGN="MIDDLE" NAME="help"></A></TD></TR></TABLE></TD><TD ALIGN="LEFT"><H3> 22.2.2 #! </H3><!--docid::SEC212::--><P>When the kernel executes a program from the file system, it checks thefirst few bytes of the file, and compares them with its internal list ofknown <EM>magic numbers</EM>, which encode how the file can be executed.This is a similar, but distinct, system to the <TT>`/etc/magic'</TT> magicnumber list used by user space programs.</P><P>Having determined that the file is a script by examining its magicnumber, the kernel finds the path of the interpreter by removing the<SAMP>`#!'</SAMP> and any intervening space from the first line of the script.One optional argument is allowed (additional arguments are not ignored,they constitute a syntax error), and the resulting command line isexecuted. There is a 32 character limit to the significant part of the<SAMP>`#!'</SAMP> line, so you must ensure that the full path to the interpreterplus any switches you need to pass to it do not exceed this limit.Also, the interpreter must be a real binary program, it cannot be a<SAMP>`#!'</SAMP> file itself.</P><P>It used to be thought, that the semantics between different kernels'idea of the magic number for the start of an interpreted script variedslightly between implementations. In actual fact, all look for<SAMP>`#!'</SAMP> in the first two bytes -- in spite of commonly held beliefs,there is no evidence that there are others which require <SAMP>`#! /'</SAMP>.</P><P>A portable script must give an absolute path to the interpreter, whichcauses problems when, say, some machines have a better version of Bourneshell in an unusual directory -- say <TT>`/usr/sysv/bin/sh'</TT>. See<A HREF="autobook_214.html#SEC214">()</A> for a way to re-execute the script with a betterinterpreter.</P><P>For example, imagine a script file called <TT>`/tmp/foo.pl'</TT> with thefollowing first line:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>#! /usr/local/bin/perl</pre></td></tr></table></P><P>Now, the script can be executed from the <TT>`tmp'</TT> directory, with thefollowing sequence of commands:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>$ cd /tmp$ ./foo.pl</pre></td></tr></table></P><P>When executing these commands, the kernel will actually execute thefollowing from the <TT>`/tmp'</TT> directory directory:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>/usr/local/bin/perl ./foo.pl</pre></td></tr></table></P><P><A NAME="IDX55"></A>This can pose problems of its own though. A script such as the onedescribed above will not work on a machine where the perl interpreter isinstalled as <TT>`/usr/bin/perl'</TT>. There is a way to circumvent thisproblem, by using the <CODE>env</CODE> program to find the interpreter bylooking in the user's <SAMP>`PATH'</SAMP> environment variable. Change thefirst line of the <TT>`foo.pl'</TT> to read as follows:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>#! /usr/bin/env perl</pre></td></tr></table></P><P>This idiom does rely on the <CODE>env</CODE> command being installed as<TT>`/usr/bin/env'</TT>, and that, in this example, <CODE>perl</CODE> can befound in the user's <SAMP>`PATH'</SAMP>. But that is indeed the case on thegreat majority of machines. In contrast, perl is installed in<TT>`usr/local/bin'</TT> as often as <TT>`/usr/bin'</TT>, so using <CODE>env</CODE>like this is a net win overall. You can also use this method to getaround the 32 character limit if the path to the interpreter is toolong.</P><P>Unfortunately, you lose the ability to pass an option flag to theinterpreter if you choose to use <CODE>env</CODE>. For example, you can'tdo the following, since it requires two arguments:</P><P><TABLE width=100%><tr><td> </td><td class=example bgcolor=#6688aa><br><pre>#! /usr/bin/env guile -s</pre></td></tr></table></P><P><A NAME="Colon"></A></TR></TABLE><BR> <FONT SIZE="-1">This document was generatedby <I>Gary V. Vaughan</I> on <I>September, 12 2004</I>using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html"><I>texi2html</I></A></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -