【问题标题】:unix code inside perlperl中的unix代码
【发布时间】:2015-10-03 23:33:22
【问题描述】:

这是代码:

#!/usr/bin/perl -w
$dir="/vol.nas/rpas_qc/mohima/Test/translations";
$dir1="/vol.nas/rpas_qc/mohima/Test/dest";
`find $dir -type f -exec rsync -a {} $dir1\`;

这一行:

find $dir -type f -exec rsync -a {} $dir1\

在 Unix 中运行良好,但在 perl 中出现错误:

Can't find string terminator "`" anywhere before EOF at test1.pl line 4

我正在尝试将 $dir 中的所有文件复制到 $dir1 而不包含子目录。 使用 perl,因为脚本会做很多其他在 perl 中更容易的事情。 任何帮助表示赞赏。

【问题讨论】:

  • 尝试在末尾使用双反斜杠 \\ 而不是单反斜杠 \。
  • 反斜杠用于转义字符。在这种情况下,它会转义反斜杠。如果你想在 $dir1 后面加一个反斜杠,你需要把 to in 来转义反斜杠。所以你需要有 $dir\\ 而不是 $dir\。
  • find $dir -type f -exec rsync -a {} $dir1\ “在 Unix 中”不能正常工作。 \ 后跟换行表示命令在下一行继续。

标签: perl shell unix


【解决方案1】:

\ 是 Perl 中的转义字符。 \ 在您的 find 命令末尾转义 `。您需要用另一个反斜杠转义。

`find $dir -type f -exec rsync -a {} $dir1 \\`;

这将失败并显示find: missing argument to -exec。您还需要在 -exec 部分的末尾使用分号。

`find $dir -type f -exec rsync -a {} $dir1 \\;`;

【讨论】:

  • 抱歉编辑正在查看我的答案并意外点击了错误的答案。它们看起来很相似,但你的措辞(以为是我的)要好得多,我去改进它。
  • @vol7ron 不用担心。我也不知道如何在代码格式中编写反引号。具有讽刺意味的是,逃避它是行不通的。
  • 您可以使用 ` ` ` 插入反引号(但在 cmets 中不起作用)。
  • 谢谢!在​​末尾添加反斜杠后,我收到了确切的错误消息。 exec 后的分号解决了。
【解决方案2】:

在 perl 中,尝试更改:

find $dir -type f -exec rsync -a {} $dir1\

收件人:

find $dir -type f -exec rsync -a {} $dir1\\

【讨论】:

    【解决方案3】:

    您需要转义反斜杠和特殊字符。一次用于 Perl 代码,另一次用于任何其他语言(在本例中是您的 shell)。

    `find $dir -type f -exec rsync -a {} $dir1\`;
    

    在上面的代码中,\ 正在转义你在 perl 中的最后一个反引号 ( ` )。因此,您的子 shell 执行永远不会终止。要解决此问题,只需添加另一个反斜杠,该反斜杠可以避免该字符被插值:

    `find $dir -type f -exec rsync -a {} $dir1\\`;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      相关资源
      最近更新 更多