`
fantaxy025025
  • 浏览: 1279525 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Perl可执行文件_井叹号(#!)pound-bang的作用_可执行脚本的本质

    博客分类:
  • Perl
阅读更多

一直以来,都没有搞清楚脚本中总是使用的井叹号(#!)的作用,现在学习perl,终于明白。

 

原理:

    在支持#!的系统中,当敲入命令(可执行文件的文件名)时,Unix系统检查文件的前两个字节。如果这两个字节是#!,系统将#!后的部分作为执行器执行此命令(即执行这个可执行文件)。

    简而言之,#!告诉sh,请用#!后面的命令执行本文件。

    例如一个可执行文件abc.pl,第一行为:#! /usr/local/bin/perl -w,则在命令行输入命令abc.pl时,sh回去查看abc.pl的前两个字符,如果是#!,则执行如下命令 /usr/local/bin/perl -w abc.pl 。

    再说的仔细一些,输入的命令一定是先给外壳程序shell去执行,当碰见#!时就改变执行者,如果没有碰到#!则仍用shell继续执行。(这个设计类似于CSS的Hack技术)

 

明白了原理,不难明白为啥写的很多shell脚本都要写上#! /usr/local/bin/zsh(等类似)。同时也知道怎么直接执行一个perl文件而不需要每回都多写一个perl命令了。


不支持#!符号的Unix系统怎么办

注意此处说的仍是Unix系统系,但不支持#!符号。

如果不支持#!,也就是说没法改变执行者,仍必须由外壳程序shell来执行到底,此时需要用到shell的特性:eval和exec。

此处仍拿perl程序abc.pl来说。

 

#! /usr/local/bin/perl
eval "exec /usr/local/bin/perl -s $0 $*" 
         if 0;
print "Perl Message! \n";
 

 

 分析一下执行过程

1. 首先shell会逐行执行,由于此处说的Unix不识别#!号,但识别注释符号#,那么第一行就被当做注释掠过去了。

2. 接下来由shell执行eval和exec,用perl命令来执行敲入的命令行和敲入的参数($0和$*)。注意这里发生了执行转换。

3. perl执行此文件abc.pl时,也把带#!号这行作为注释对待,执行第二行和第三行时由于有if 0 这个总是为false的判断,因此也不执行这两行。接下来就执行正常处理了。

(这个设计真的很棒,有些回调的味道,同时又类似于CSS的Hack技术)

 

-s作为开关参数传给perl,让perl从标准的标准$PATH中寻找文件(abc.pl),从而避免了写abc.pl的绝对路径。

这个设计执行时有shell作为父进程,perl执行作为子进程,两个进程都执行了同一个文件abc.pl。

留一个问题:shell父进程怎么执行print "Perl Message! \n";及后面的行?

 

DOS/Windows下怎么让perl程序成为可执行的

也就是说,使用abc.pl时,键入abc arg1 arg2 而不是键入perl abc.pl arg1 arg2 或者键入c:/setup/perl/bin/perl abc.pl arg1 arg2

 

首先windows/DOS下,仅仅可以执行exe/msi/bat/com程序。道理还是一样的,用hack技术了。

同时windows下的perl有一个perl.exe可以帮助执行。

并不常用,略。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    JavaScript中双叹号(!!)作用示例介绍

    在JavaScript编程语言中,双叹号(!!)是一个常用的操作符,用于将任何值强制转换为布尔值(Boolean)。这种转换在JavaScript中非常常见,因为JavaScript是一种弱类型语言,即变量不需要显式声明类型,它们会根据所...

    JavaScript中双叹号!!作用示例介绍

    JavaScript中双叹号(!!)的作用是将任意值通过逻辑非操作符(!)两次使用,将其强制转换为布尔值(boolean)。在JavaScript中,布尔转换遵循特定规则,即“假值”(falsy values)在转换后为false,而“真值”...

    小学生标点符号用法详解.docx

    - **知识点解析**:问号用于疑问句的末尾,同时也可用于反问句和设问句的末尾。问号的使用能够帮助读者理解句子的提问性质,并调整朗读的语气。 - **例句解析**: - “他叫什么名字?”这是一个典型的疑问句,用于...

    MySQL用户密码中的特殊字符叹号(!)的妙用

    本文将深入探讨叹号(!)在MySQL用户密码中的妙用以及可能导致的问题。 首先,我们要明白,叹号(!)在Linux或Unix shell中是一个特殊的字符,它用于调用历史记录中的命令。当在命令行中输入含有叹号的密码时,...

    yahoo-logo点击叹号发音按钮.rar

    logo上的叹号(!),当用户点击这个按钮时,会播放一段声音。 实现这样的功能通常需要以下几个步骤: 1. **HTML结构**:首先,我们需要在HTML中创建一个按钮元素,可能是一个`<button>`或`<a>`标签,它包含Yahoo!...

    linux中叹号命令(!)的使用小结

    在Linux操作系统中,叹号(!)是一个非常有用的快捷方式,它允许用户快速引用和重复先前输入的命令,从而提高命令行交互的效率。这篇总结将深入探讨Linux中叹号命令的各种用法。 1. **双叹号(!!)** 双叹号(!!)...

    SVN用户操作手册.....

    - 当文件被修改后,系统会为其及父目录加上红色叹号。 - 右键点击工作区文件夹,选择`Commit`提交修改。 - 提交前,需先进行`Update`操作以获取最新版本。 #### 四、其他操作 ##### 1. 比较文件的不同之处 - **...

    叹号批量删除文件工具 叹号文件批量删除工具 v1.02

    在实际应用中,叹号批量删除文件工具 v1.02 可广泛应用于各种场景。比如,定期清理日志文件、整理下载目录、卸载软件后残留的临时文件等。它的出现,使得文件管理变得更为便捷,让繁琐的清理工作变得简单。 总结...

    SVN的基本操作

    - 对版本库中的文件进行编辑后,系统会自动标识这些文件(通常显示为红色叹号),表示这些文件已经被修改。 - 修改完毕后,右键点击工作区文件夹,选择“Commit”提交修改。 - 输入密码确认后,修改内容将被同步到...

    WIN7 ME叹号补丁.rar

    根据提供的信息,压缩包内的文件名为“WIN7 ME叹号补丁”,这可能是一个单一的可执行文件(.exe),或者是一个包含多文件的文件夹结构。用户在解压后,按照补丁的安装说明运行这个文件,通常需要管理员权限,以便...

    slidingmenu

    2.项目红叉或红叹号,删除support_v4包,ActionBarSherLock(slidingmenu_actionbar)已包含此包,会冲突。也有可能是主题问题,注意appication theme是否正确,参照exsample。 3.注意把ActionBar、某些Fragment等替换...

    串口无法读取显示黄色叹号,串口驱动下载

    提供的压缩包文件“串口无法读取显示黄色叹号prolific usb-to-serial驱动”和“prolific usb-to-serial驱动”应该包含了适用于PL2303的驱动程序。 安装步骤如下: 1. 解压下载的驱动文件。 2. 进入设备管理器,找到...

    js特效脚本含源码和说明yahoo-logo点击叹号发音按钮

    js特效脚本含源码和说明yahoo-logo点击叹号发音按钮本资源系百度网盘分享地址

    WAN微型端口(网络监视器)出现黄色叹号解决办法.docx

    WAN 微型端口(网络监视器)出现黄色叹号是指在执行系统更新后,设备管理器中 WAN 微型端口(网络监视器)出现黄色叹号,影响正常网络功能的现象。这种情况的出现可能是由于系统更新过程中 registry 条目中的某些...

    java基础知识点67条

    - 当项目文件中出现红色叹号时,通常意味着项目存在问题,如缺少必要的库文件(jar包)。解决方法是检查项目的依赖并重新导入缺失的库。 #### 14. Web项目结构 - `web.xml`文件与`lib`目录是Web项目中常见的组成部分...

    me叹号、TXE叹号、驱动不兼容补丁合集

    "me叹号"和"TXE叹号"通常指的是在Windows系统中遇到的两种特定错误提示,而"驱动不兼容补丁合集"则是一个专门针对这些问题的解决方案。 "me叹号",全称为"Memory Error",通常在Windows系统中出现此错误时,屏幕会...

Global site tag (gtag.js) - Google Analytics