从perl脚本执行Shell命令包含垃圾字符

时间:2017-01-09 11:25:54

标签: perl

我有一个perl脚本,它运行一个shell命令并解析输出,如下所示:

# Using ls -ltr for illustration. Actual command is different.
my $cmd = "ls -ltr 2>&1 | ";
open (CMD, $cmd ) || die "Cant run $cmd";

while (my $line = <CMD>) {
  chomp $line;
  ...
  ...
}

即使使用$line,上述chomp也包含垃圾字符。我已经尝试将输出重定向到文件并从文件中读取,但即使文件中也包含垃圾/垃圾字符。

执行上述命令的示例输出:

^[[H^[[Jtotal 12
drwx------ 2 root root 4096 Dec 19 15:30 tad4d
drwx------ 2 root root 4096 Jan  2 15:37 oup
-rw-r--r-- 1 root root  137 Jan  9 06:25 alth.txt

在上面的输出中,在total 12之前,存在一些垃圾字符。

  1. 垃圾字符进入shell命令输出的原因是什么?
  2. 如何避免垃圾/垃圾角色?
  3. 由于

2 个答案:

答案 0 :(得分:2)

1 - 在不知道命令的情况下无法回答。如果它是ls你不应该解析ls,但你表明你不是。^[[H^[[J。使用您输入的示例输入:$PS1 - 是一个转义码,用于终端中的颜色等内容。请参阅:Control Sequences -

可能来自您的提示。检查shell中open ( my $output, '-|', 'ls', '-ltr' ); while ( <$output> ) { print; } 的设置。但是那里有一个涉及绕过shell的解决方法:

s/[^\w\s]+//g

这样你就不会在处理过程中涉及shell,所以任何'垃圾'都直接来自你正在运行的命令。

请参阅:perlfaq

2 - 修复命令以不生成“垃圾”。我不能更具体,因为我不知道你的意思。但是通过正则表达式来运行它以过滤掉特定的“垃圾”字符是非常可行的。例如。 open将过滤掉不是字母和空格的任何内容。虽然注意 - 这会删除标点符号,但您可以通过阅读perlre

找出更合适的示例

在你的例子中 - 因为它是转义代码 - 你不仅仅获得控制代码,而是获取转义序列。这可能对过滤器来说更加烦人,因为它们没有固定的长度。但也许这会有所帮助:Best way to remove ANSI color escapes in Unix

我指出使用词法文件句柄作为补充 - 3参数.otherwise({ class: 'page-not-found', title: '404 Page Not Found', description: '404 Page Not Found', templateUrl: '/app/static/404.html', controller: 'mainController as mainCtrl' }); 是一种很好的做法,并避免了一些问题。

答案 1 :(得分:1)

您已将shell配置为在启动时调用clear。这些字符由clear发出,用于指示终端归位光标并清除自身。您应该限制调用clear来登录shell和/或交互式shell。