【问题标题】:how to pass command line arguments to perl script file in one-line如何在一行中将命令行参数传递给 perl 脚本文件
【发布时间】:2021-03-29 09:51:51
【问题描述】:

我有一个 perl 脚本文件,它在 ubuntu 终端上运行

所以在运行时,我会这样调用它:

./myscript.pl

在运行时,在终端下,它开始要求我应该记录一些“确认”(用于配置),如下所示:

然后,另一次与另一次要求“确认”

,然后再进行近 10 次不同的配置确认 我总是使用默认选项。

所以我的目的是如何能够一次完成,只用一行命令,然后能够将它放在 bash_profile 下。

我会试试这个:

./myscript.pl "yes" "yes "no" ..... "yes"

但我不知道这是否可行。

【问题讨论】:

  • 对于您希望始终回答“是”的程序,您希望通过管道输入yes(或yes no,它将重复输出“否”)。我不知道有谁可以按正确的顺序回答多个不同的问题。

标签: perl


【解决方案1】:

有多种方法可以处理这个问题。如果您控制程序,您应该重新安排它以在它不是交互式时接受默认值(IO::Interactive 是一个很好的工具)。

对于真正快速的事情,有时我只是从ExtUtils::MakeMaker 窃取prompt。它是独立的,因此您可以根据需要窃取和修改它:

#!perl
use v5.10;

use ExtUtils::MakeMaker qw(prompt);

my @answers;
push @answers, prompt( "First", "yes" );
push @answers, prompt( "Second", "yes" );
push @answers, prompt( "Third", "yes" );

say "Done! Got @answers";

如果我正常运行,我必须回答提示:

$ perl yes.pl
First [yes] cat
Second [yes] dog
Third [yes] bird
Done! Got cat dog bird

但是ExtUtils::MakeMaker 有一个环境变量可以接受默认值:

$ PERL_MM_USE_DEFAULT=1 perl yes.pl
First [yes] yes
Second [yes] yes
Third [yes] yes
Done! Got yes yes yes

从这里到答案的结尾只是提供输入的 shell 技术。没有特殊的 Perl 东西在发生。而且,根据程序本身试图做的事情,有些事情可能无法正常工作。

我也可以喂它/dev/null,在这种情况下,它会意识到程序没有以交互方式运行,并且它接受我的默认值:

$ perl yes.pl < /dev/null
First [yes] yes
Second [yes] yes
Third [yes] yes
Done! Got yes yes yes

但是,我也可以输入一个多行字符串:

$ perl yes.pl <<HERE
yes
yes
no
HERE
First [yes] Second [yes] Third [yes] Done! Got yes yes no

这对你的文件来说可能太多了,所以你可以用嵌入的行来回显一个字符串:

$ perl yes.pl < <( echo -e "yes\nno\nhello")
First [yes] Second [yes] Third [yes] Done! Got yes no hello
$ perl yes.pl < <( echo $'yes\nno\nhello')
First [yes] Second [yes] Third [yes] Done! Got yes no hello

或者从文件中获取输入:

$ perl yes.pl < input.txt
First [yes] Second [yes] Third [yes] Done! Got heck yeah no way yep

而且,从simbabque's answer 偷来的,因为我要列出技术列表:

$ printf "yes\nyes\nno\n...\nyes\n" | yes.pl

【讨论】:

    【解决方案2】:

    您可以使用printf on the commandline 将多行输入通过管道传输到您的程序中。如果它期望像yesno 这样的东西以固定的顺序排列,那就足够了。

    $ printf "yes\nyes\nno\n...\nyes\n" | ./myscript.pl
    

    更多信息请见this blog post

    【讨论】:

      【解决方案3】:

      这完全取决于您的程序是如何编写的。我怀疑它看起来像这样:

      #!/usr/bin/perl
      
      use strict;
      use warnings;
      
      my $default = 'yes';
      print "Do you want to proceed with this installation? [$default] ";
      chomp( my $answer = <STDIN> );
      
      $answer = $default unless length $answer;
      
      print "You said $answer\n";
      

      在这种情况下,您可以使用如下代码在命令行中传递默认值:

      #!/usr/bin/perl
      
      use strict;
      use warnings;
      
      my $default = 'yes';
      my $answer;
      
      if (@ARGV) {
        $answer = shift;
      } else {
        print "Do you want to proceed with this installation? [$default] ";
        chomp( $answer = <STDIN> );
      }
      
      $answer = $default unless length $answer;
      
      print "You said $answer\n";
      

      您需要为每个单独的提示重复这些更改。

      【讨论】:

        猜你喜欢
        • 2013-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-24
        • 1970-01-01
        • 2014-03-08
        • 2013-10-22
        • 2016-12-19
        相关资源
        最近更新 更多