【问题标题】:How can I properly run Perl "one liner" command line scripts?如何正确运行 Perl“单线”命令行脚本?
【发布时间】:2011-03-14 07:25:04
【问题描述】:

我浏览了许多教程,但我仍然无法弄清楚我做错了什么......我正在尝试下面的代码(在 .pl Perl 文件中,作为可执行文件):

#!/usr/bin/perl

perl -e 'print "Hello";' 

我运行这个脚本并得到:

/home/user1/Desktop/file_backups.pl 的执行由于编译错误而中止。

(我是使用 Perl 调用 Linux 命令行的新手。)

【问题讨论】:

标签: linux perl command-line


【解决方案1】:

试试:

#!/usr/bin/perl
# This is a comment ~~~
# This script will be run as a Perl script
# since 'perl' isn't a keyword or function in Perl
# something like this must fail:
#
# perl -e 'print "Hello";' 
#
# The following should work.

print "Hello"; print " World\n";

或者,如果您希望您的 shell 脚本执行 Perl 代码:

#!/bin/sh
# That's a Bash script ~~~
# It's just a command line in a file ...    

perl -e 'print "Hello World";' 

背景:#! 是一个interpreter directive

命令执行时,转换为解释器的执行。

【讨论】:

    【解决方案2】:

    您可能正在尝试这样做:

    system("/usr/bin/perl -e 'print \"Hello!\\\\n\";'");
    

    【讨论】:

    • 感谢您的回复.. 我想做的是编写与命令行交互的 perl 脚本,我想我把它倒退了,因为我正在看的是 bash / shell 脚本调用 perl
    • 这只是个坏建议。 OP 想在 Perl 脚本中打印 hello。所以只需使用打印。
    • @ghostdog:我不是想建议这个,这只是一个直接问题的答案。我试着不去评判。不管怎样,看起来他正在寻找相反的方向,所以我们都走了。 :-)
    【解决方案3】:

    perl 不是 Perl 脚本中的有效命令。如果您将该文件命名为 .sh 脚本,并在 shebang 行上使用 #!/bin/bash,它会起作用,但编写一个 bash 文件只是为了调用 Perl 并没有多大意义(为什么不直接调用 Perl?)

    由于您提到要与命令行交互,我将在此提及您可以通过@ARGV 数组获得 Perl 中的命令行选项。 (见perldoc perlvar。)

    【讨论】:

      【解决方案4】:

      既然你说你正在寻找相反的东西,这可能就是你的意思:

      # vi stdin.pl
      # cat stdin.pl
        #!/usr/bin/perl
        while(<STDIN>)
        {
            if( /^hello/ ){ print "Hello back to ya!\n"; }
        }
      # chmod 0777 stdin.pl
      # ./stdin.pl
        foo
        hello
        Hello back to ya!
      #
      

      【讨论】:

        【解决方案5】:

        只需在命令行输入(不在文件中):

        perl -e 'print "Hello World\n";'
        

        这仅对单线人员非常有用。较长的脚本需要自己的文件...

        【讨论】:

          【解决方案6】:

          假设您有以下输入:

          $ for i in a b c ;做 echo "$i is $i" > $i;完毕
          
          $ 猫 a b c
          是一个
          b是b
          c是c

          每个人都知道大写字母要好得多

          perl -i.bak -pe '$_ = uc' a b c

          那么现在

          $ cat a b c
          一个是一个
          乙是乙
          C是C

          但我们真的很想在一个名为 upcase 的命令中实现这一点,这很容易做到!

          #! /usr/bin/perl -pi.bak
          $_ = uc
          

          在工作中看到它:

          $ for i in a b c ;做 echo "$i is $i" > $i;完毕
          
          $ 猫 a b c
          是一个
          b是b
          c是c
          
          $ ./大写 a b c
          
          $ !猫
          猫 a b c
          一个是一个
          乙是乙
          C是C

          来自answer to a similar question 的更多提示:

          -e 选项引入了要执行的 Perl 代码(您可能会将其视为命令行上的脚本),因此请放下它并将代码粘贴到正文中。将-p 留在shebang (#!) 行中。

          一般来说,在 shebang 行中最多坚持一个“集合”选项是最安全的。如果您需要更多,您可以随时将它们的等价物放入 BEGIN {} 块中。

          别忘了打开执行位!

          chmod +x script-name
          

          【讨论】:

            【解决方案7】:

            这应该可行。双引号外单引号内;)

            perl -e "print 'Hello'"
            

            【讨论】:

            • 很抱歉恢复这个旧帖子,但是我在哪里可以看到选项的含义? (即你的“-e”)谢谢
            • @Sos:这是个好问题。有人会认为它在man page for Perl 上,但它不是(或者在-e 的情况下非常非常简洁)。常用选项-l(l 作为“Perl”中的最后一个字母)和-n 在手册页上根本没有记录...关键字是perlrun(在手册系统中:perlrun) ,但它不能作为手册页开箱即用。
            • $ perldoc perlrun(实际上 man perlrun 在我的 Debian 派生的 Bunsen 安装上工作)
            猜你喜欢
            • 2013-07-18
            • 2011-05-31
            • 1970-01-01
            • 2016-02-20
            • 2014-10-27
            • 2013-06-12
            • 1970-01-01
            • 2014-04-11
            • 2012-08-29
            相关资源
            最近更新 更多