【问题标题】:execute shell commands from perl script从 perl 脚本执行 shell 命令
【发布时间】:2014-09-08 08:18:48
【问题描述】:

我想将 *.DIF 文件重命名为 *.SUC 文件 但以下脚本给出“sh:bad substitution”错误 我不能使用“重命名”,因为我的操作系统不是 Linux。

$com="for i in *.DIF; do mv \$i \${i/DIF/SUC}; done;";
print $com."\n";
print `$com`;

输出:

for i in *.DIF; do mv $i ${i/DIF/SUC}; done;

sh: bad substitution

【问题讨论】:

  • 在执行“for i in *.DIF; do mv $i ${i/DIF/SUC}; done;”时在 shell 上工作正常。
  • 为什么不直接使用 perl rename 函数?
  • 为什么你的脚本有SUC,而输出却有DIFFF
  • 反引号表示run with sh。但真的。不要这样做。交叉污染脚本语言是为自己构建一些可怕的错误和无法维护的代码的绝佳方式。坚持使用一种语言 - perl 或 shell,不管哪种。

标签: perl shell


【解决方案1】:

如果您在使用 Perl 的 rename 时遇到问题,请使用 File::Copy,这是一个独立于平台的模块,用于移动和复制文件。它是一个核心模块,所以它应该已经是 Perl 安装的一部分。

如果系统命令在您输入 shell 时有效,但在 Perl 中无效,最可能的原因是 Perl 没有使用您期望的 shell。不过,我们需要有关您的系统的更多信息才能确定。

【讨论】:

    【解决方案2】:

    无需为您可以在 Perl 中轻松完成的文件操作而费尽心思。

    以下将您的所有.dif 扩展文件重命名为.suc

    use strict;
    use warnings;
    
    use File::Copy qw(move);
    
    move($_, s/dif$/suc/r) for glob('*.dif');
    

    【讨论】:

      【解决方案3】:

      默认 perl 使用的是 sh,而不是 bash,它允许 {//} this question 帮助了。 最后我用了:

      open my $bash_handle, '| bash' or die "Cannot open bash: $!";
      print $bash_handle 'for i in *.SUC; do mv $i ${i/SUC/DIF}; done;';
      

      【讨论】: