2017-01-09 192 views
0

我有運行在外殼命令並分析輸出一個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. 如何避免垃圾/垃圾字符?

感謝

+0

需要一個「垃圾」的例子來回答。 – Sobrique

+0

添加了一個示例輸出! – Fazlin

+0

'^ ['是一個轉義碼。你有配置提示,特別是有顏色的配置嗎? ('echo $ PS1'應該告訴你) – Sobrique

回答

2

1 - 不能回答不知道的命令。如果它是ls,你不應該解析ls,但你表明你不是。通過您提供的示例輸入:^[[H^[[J - 是一種轉義代碼,用於終端中顏色等事物。參見:Control Sequences-

可能來自您的提示。檢查你的shell中設置了什麼$PS1。但是,有一個變通方法有沒有涉及到繞過外殼:

open (my $output, '-|', 'ls', '-ltr'); 
while (<$output>) { 
    print; 
} 

這樣,你就不會涉及在處理所有的外殼,所以任何「垃圾」從您正在運行的命令直接來自。

參見:perlfaq

2 - 修復命令不產生 「垃圾」。我不能更具體,因爲我不知道你的意思。但通過正則表達式來過濾特定的「垃圾」字符是非常可行的。例如。 s/[^\w\s]+//g將過濾掉任何不是字母數字和空格。雖然注意 - 這將刪除標點符號,但您可以通過閱讀perlre

來找出一個更合適的示例。雖然在您的示例中 - 因爲它是轉義碼 - 您不僅僅獲取控制代碼,而是轉義序列。這可能是更煩人的過濾,因爲它們沒有固定的長度。但也許這將有所幫助:Best way to remove ANSI color escapes in Unix

我會指出,作爲補充 - 3參數open使用詞法文件句柄是很好的做法,並避免一些陷阱。

+0

當使用'-c'時沒有使用提示符,所以它不是來自提示符。可能來自一個寫得不好的shell啓動文件。這是'clear'發出的序列。 – ikegami

1

您已將shell配置爲在啓動時調用clear。這些字符由clear發出,以指示您的終端將光標置回原位並自行清除。您應該限制呼叫clear登錄shell和/或交互式shell。