【问题标题】:Execute a command using a perl script使用 perl 脚本执行命令
【发布时间】:2012-10-20 16:45:21
【问题描述】:

我在 unix 中有简单的命令,比如

cat myfile.txt >&mytemp.txt&

上述命令将简单地创建文件 myfile.txt 的副本。 当我在命令行上执行命令时,它会返回如下进程 ID:

> cat myfile.txt > & mytemp.txt &
[1] 769
>

我在 perl 脚本中形成相同的命令并使用系统调用它,如下所示:

my $cmd="cat myfile.txt>&mytemp.txt&";
my $info = system("$cmd");

但系统命令失败并显示以下错误消息:

sh: mytemp.txt: bad number

我什至尝试转义>&。但是错误消息没有变化。 我可以知道这是什么原因吗?我哪里错了?

【问题讨论】:

  • 在我的情况下,系统命令不会失败。我得到输出 0。我正在打印 $info
  • 你想做什么?我怀疑这不仅仅是复制文件,您可以使用 File::Copy 来完成。您是否尝试在继续运行的同时在后台启动一个进程(在这种情况下,您是否想从该进程中获取信号)?您是否只想获取进程的输出并放入文件中?你正在运行的进程是否运行了很长时间?
  • @Uri。你说得对,我只是想运行一个后台进程。我只需要退出进程并继续执行下一个语句。我什至不需要任何回报正在运行!

标签: perl unix command-line


【解决方案1】:

我很确定您不能在此使用尾随 &。如果您希望您的程序在命令运行时继续,那么fork 并让子进程运行调用,然后退出。可能exec 可以做到这一点,虽然我之前没有尝试过使用输出重定向来做到这一点......

【讨论】:

  • 如果你想后台进程fork绝对是要走的路。
  • 我有一个进程可以输出到控制台以及一个日志文件。如果我想抑制输出到控制台的输出,我使用>&file&。这就是我需要的原因使用&符号。我什至尝试使用 fork 运行良好,但它会将输出抛出到控制台。如果我使用&>&,那么即使分叉也无济于事,因为它再次抛出错误的数字错误。
  • 那么问题是你想为进程捕获 STDERR 和 STDOUT 并将它们重定向到文件?
【解决方案2】:

正如消息中所说,这不是有效的sh 命令。可能是csh 命令?

system('csh', '-c', $cmd);

【讨论】:

    【解决方案3】:

    试试这个:

    perl -e "`cat myfile.txt>&mytemp.txt&`;"
    

    它正在执行命令并返回命令输出。 所以可以这样做:

    #!/usr/bin/perl
    my $content = `cat /etc/passwd`;
    print $content;
    

    如果将代码放入 perl 脚本中:

    cat-test.pl

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $res = `cat myfile.txt>&mytemp.txt&`;
    

    【讨论】:

    • 您是否尝试过将cat myfile.txt>&mytemp.txt& 放入您的 perl 脚本中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2015-10-30
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多