【问题标题】:Calling perl script from a perl script从 perl 脚本调用 perl 脚本
【发布时间】:2011-12-09 04:18:41
【问题描述】:

我想在 bash shell 中从带有大参数列表的 perl 脚本调用 perl 脚本。参数包含特殊字符,例如 \*() 等。每个特殊字符都由单个转义字符 \ 引导。

但是当我从第一个 perl 脚本调用第二个 perl 脚本(然后调用一个 shell 脚本)时,转义字符会被评估,特殊字符会暴露在 shell 中,因此会出现语法错误。

所以基本上我想在我从第一个 perl 脚本调用第二个 perl 脚本时防止转义字符的评估,当我从我的第二个 perl 脚本调用 shell 脚本时应该评估它。

例如。第一个 perl 'MonitorAdmin' 脚本的输入是:

MonitorAdmin -reversefilter -container="LogServerContainer" -filepath="/home/esg2/YogeshTemp/VSDEFAULT/logs" -filename="System.log" -pattern=".*\t.*\t(DEBUG)\t.*\t.*\t.*\t(SecurityService)\t.*\t.*\t.*\t.*\t.*" -linecount="5001" -targetfile="

【问题讨论】:

  • 我想避免向 MonitorAdmin 脚本的参数添加另一个转义字符。
  • 向我们展示您的错误代码,以便我们修复它。

标签: perl bash shell


【解决方案1】:

如果您向 Perl 的 execsystem 命令传递一个包含多个元素的列表,它们将不会调用 shell,但是每个列表元素都会成为一个单独的参数,即空格不会分隔参数。我想这即使在执行 shell 脚本时也能很好地工作,因为您没有使用 -c 选项调用 shall。

【讨论】:

  • 这里涉及 3 层,首先调用 MonitorAdmin perl 脚本,该脚本执行另一个 perl 脚本,如下所示:system "bash" , "-fc", "2ndPerlScript @ARGV" 然后是第二个 perl脚本在 getoptions 的帮助下积累用户参数并将它们传播到 shell 脚本,如下所示:system "bash", "-fc", "ShellScriptName $ARGUMENT_LIST"
  • 但问题是当我在后续调用中传递@ARGV 列表时,转义字符会被评估。
【解决方案2】:

system 有两种形式,一种是执行 shell 命令 (system($shell_cmd)),另一种是启动程序 (system($program, @args))。我们可以从您的灯帖中看出,您似乎使用了错误的帖子。你只需要

system('MonitorAdmin2', @ARGV)

没有外壳可以“误解”字符。

【讨论】:

  • 是的,这似乎解决了有关特殊字符的问题,但现在面临另一个问题,即。我想将更多参数与 @ARGV 列表一起传递给 MonitorAdmin 命令。我将如何以这种形式的“系统”命令来做到这一点?
  • @Yogesh,它不必是一个数组,更不用说@ARGV。只需构建一个返回适当列表的表达式。
  • 感谢您的帮助,真的很有帮助。