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

从perl脚本执行的Shell命令包含垃圾字符,perl,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; ... ... } 在上述输出中,total

我有一个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;
  ...
  ...
}
在上述输出中,
total 12
之前,存在一些垃圾字符

  • 垃圾字符进入shell命令输出的原因可能是什么
  • 如何避免垃圾/垃圾字符

  • 谢谢

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

    这可能来自您的提示。请检查shell中的
    $PS1
    设置。但有一个解决方法涉及绕过shell:

    open ( my $output, '-|', 'ls', '-ltr' );
    while ( <$output> ) { 
         print;
    }
    
    open(我的$output,'-|','ls','-ltr');
    而{
    印刷品;
    }
    
    这样,您就不会让shell参与处理,因此任何“垃圾”都直接来自您正在运行的命令

    见:

    2-修复命令以不生成“垃圾”。我不能说得更具体,因为我不知道你的意思。但是通过正则表达式运行它以过滤掉特定的“垃圾”字符是完全可行的。例如,
    s/[^\w\s]+//g
    将过滤掉任何不是字母数字和空格的内容。虽然注意-这将删除标点符号,但您可以通过阅读找出更合适的示例

    但在您的示例中-因为是转义码-您得到的不仅仅是控制码,而是转义序列。这可能更讨厌过滤,因为它们没有固定的长度。但这可能会有帮助:


    作为补充-3参数,我要指出使用词法文件句柄
    open
    是一种很好的做法,可以避免一些错误。

    1-在不知道命令的情况下无法回答。如果它是
    ls
    ,你不应该解析
    ls
    ,但你指出你不是。通过你给出的示例输入:
    ^[[H]^[[J
    -是一种转义码,用于终端中的颜色。请参阅:-

    这可能来自您的提示。请检查shell中的
    $PS1
    设置。但有一个解决方法涉及绕过shell:

    open ( my $output, '-|', 'ls', '-ltr' );
    while ( <$output> ) { 
         print;
    }
    
    open(我的$output,'-|','ls','-ltr');
    而{
    印刷品;
    }
    
    这样,您就不会让shell参与处理,因此任何“垃圾”都直接来自您正在运行的命令

    见:

    2-修复命令以不生成“垃圾”。我不能说得更具体,因为我不知道你的意思。但是通过正则表达式运行它以过滤掉特定的“垃圾”字符是完全可行的。例如,
    s/[^\w\s]+//g
    将过滤掉任何不是字母数字和空格的内容。虽然注意-这将删除标点符号,但您可以通过阅读找出更合适的示例

    但在您的示例中-因为是转义码-您得到的不仅仅是控制码,而是转义序列。这可能更讨厌过滤,因为它们没有固定的长度。但这可能会有帮助:


    作为一个补充-3参数,我要指出使用词法文件句柄打开是一个很好的做法,可以避免一些问题。

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

    您已将shell配置为在每次启动时调用
    clear
    。这些字符由
    clear
    发出,以指示您的终端返回光标并清除自身。您应限制调用
    clear
    登录shell和/或interactive shell。

    需要一个“垃圾”示例才能回答。添加了一个示例输出!!
    ^[/code>是一个转义代码。您是否配置了提示,特别是带有颜色的提示?(
    echo$PS1
    应该告诉您)
    ^[[H^[/J
    是垃圾我需要一个“垃圾”示例为了能够回答。添加了一个示例输出!!
    ^[/code>是一个转义码。您是否配置了提示,尤其是带有颜色的提示?(
    echo$PS1
    应该告诉您)
    ^[[H]^[[J
    是垃圾am gettingPrompt在使用
    -c
    时不使用,因此它不是来自提示符。可能来自写得不好的shell启动文件。这是由
    clear
    发出的序列。使用
    -c
    时不使用提示符,因此它不是来自提示符。可能来自写得不好的shell启动文件。这是是由清除发出的序列。