使用eval在shell脚本中执行perl代码

使用eval在shell脚本中执行perl代码,perl,unix,Perl,Unix,我遇到了下面的例子。我试着用谷歌搜索,但找不到太多,所以我把这个问题贴在这里 这样执行perl脚本有什么好处 一旦执行完perl代码,我们如何使shell脚本像“普通”shell脚本一样工作 代码如下: #!/bin/ksh #! -*- perl -*- eval 'exec $PERLLOCATION/bin/perl -x $0 ${1+"$@"} ;' if 0; print "hello world\n"; # how can I make it behave like a "nor

我遇到了下面的例子。我试着用谷歌搜索,但找不到太多,所以我把这个问题贴在这里

  • 这样执行perl脚本有什么好处
  • 一旦执行完perl代码,我们如何使shell脚本像“普通”shell脚本一样工作
  • 代码如下:

    #!/bin/ksh
    #! -*- perl -*-
    eval 'exec $PERLLOCATION/bin/perl -x $0 ${1+"$@"} ;'
    if 0;
    
    print "hello world\n";
    # how can I make it behave like a "normal" shell script from this point onwards? What needs to be done?
    # echo "hello world" ### this results in error
    

    文档中描述了这个习惯用法。
    -x
    开关扫描整个文件,并忽略以
    #开头的第一行之前出现的任何内容
    还包含单词
    perl
    。 这意味着您的系统将使用Perl解释器运行脚本,无论您是使用
    Perl
    还是使用shell命令(
    sh/bash/ksh/
    等)调用脚本 就是

    两者都将使用
    perl
    运行脚本

    为了解决第二个问题,这个习惯用法与在同一个文件中组合shell脚本和Perl脚本几乎没有任何关系。有几种不同的方法来解决这个问题,但最可读的方法可能是用shell脚本编写,但使用shell的herdoc表示法来调用perl代码

    #!/bin/bash
    # this is a bash script, but there is some Perl in here too
    
    echo this line is printed from the shell
    echo now let\'s run some Perl
    
    perl <<EOF
    # this is now perl script until we get to the EOF
    print "This line is printed from Perl\n";
    EOF
    
    echo now this is from the shell script again
    
    #/bin/bash
    #这是一个bash脚本,但这里也有一些Perl
    echo此行是从外壳打印的
    echo现在让我们运行一些Perl
    
    perl文档中描述了这个习惯用法。
    -x
    开关扫描整个文件,并忽略以
    #开头的第一行之前出现的任何内容
    还包含单词
    perl
    。 这意味着您的系统将使用Perl解释器运行脚本,无论您是使用
    Perl
    还是使用shell命令(
    sh/bash/ksh/
    等)调用脚本 就是

    两者都将使用
    perl
    运行脚本

    为了解决第二个问题,这个习惯用法与在同一个文件中组合shell脚本和Perl脚本几乎没有任何关系。有几种不同的方法来解决这个问题,但最可读的方法可能是用shell脚本编写,但使用shell的herdoc表示法来调用perl代码

    #!/bin/bash
    # this is a bash script, but there is some Perl in here too
    
    echo this line is printed from the shell
    echo now let\'s run some Perl
    
    perl <<EOF
    # this is now perl script until we get to the EOF
    print "This line is printed from Perl\n";
    EOF
    
    echo now this is from the shell script again
    
    #/bin/bash
    #这是一个bash脚本,但这里也有一些Perl
    echo此行是从外壳打印的
    echo现在让我们运行一些Perl
    
    perl1.如果以常规方式启动perl脚本:

    #!/usr/bin/perl
    print "hello world\n";
    
    #行仅在Perl解释器实际安装在
    /usr/bin
    下时才起作用。您展示的perl/ksh双语脚本是一个棘手的难题,即使在其他地方安装了perl,也无法使脚本正常工作。有关详细信息


    2.你不能。当shell进程遇到
    exec
    命令时,它终止并将控制权移交给perl。(从技术上讲,它是。)之后运行更多shell命令的唯一方法是启动一个新的shell。

    1。如果您以常规方式启动Perl脚本:

    #!/usr/bin/perl
    print "hello world\n";
    
    #行仅在Perl解释器实际安装在
    /usr/bin
    下时才起作用。您展示的perl/ksh双语脚本是一个棘手的难题,即使在其他地方安装了perl,也无法使脚本正常工作。有关详细信息


    2.你不能。当shell进程遇到
    exec
    命令时,它终止并将控制权移交给perl。(从技术上讲,它是。)之后运行更多shell命令的唯一方法是启动一个新的shell。

    这比已经发布的要简单得多

    #!$PERLLOCATION/bin/perl
    
    不工作,因为shebang(
    #!
    )行由内核(而不是shell)解释,内核不执行变量插值


    代码调用
    ksh
    来扩展环境变量并启动指定的Perl安装。

    这比已经发布的要简单得多

    #!$PERLLOCATION/bin/perl
    
    不工作,因为shebang(
    #!
    )行由内核(而不是shell)解释,内核不执行变量插值


    代码调用
    ksh
    来扩展环境变量并启动指定的Perl安装。

    值得指出的是,这种“习惯用法”在现代系统上几乎没有必要;它是作为一种解决方案来实现的,适用于shebang线不能像您希望的那样工作的系统。@tripleee,需要指出的是OP实际上并没有使用这个习惯用法,拥有一个现代系统在这里也没有帮助。需要指出的是,这个“习惯用法”在现代系统上几乎没有必要;它是作为一种解决方案来实现的,适用于shebang线不能像您希望的那样工作的系统。@tripleee,需要指出的是OP实际上没有使用这个习惯用法,拥有一个现代化的系统在这里是没有帮助的。请参阅,以了解各种方法的详细说明。请参阅,了解各种方法的详细说明。