2012-10-31 161 views
0

執行命令我在UNIX中有簡單的命令像使用perl腳本

cat myfile.txt >&mytemp.txt& 

上述命令會創建該文件的myfile.txt的副本。 當我在命令行中執行命令返回我的進程ID象下面這樣:

> cat myfile.txt > & mytemp.txt & 
[1] 769 
> 

我形成一個perl腳本中相同的命令,並與系統,如下稱之爲:

my $cmd="cat myfile.txt>&mytemp.txt&"; 
my $info = system("$cmd"); 

但系統正命令失敗,下面的錯誤消息:

sh: mytemp.txt: bad number 

我即使逸出>和試圖.But錯誤信息沒有變化。 我可以知道這個原因嗎?我在哪裏錯了?

+0

在我的情況下,系統命令不失敗。我得到輸出0.我打印'$ info'。 –

+0

你在做什麼?我懷疑這不僅僅是複製一個文件,你可以用File :: Copy來完成。您是否試圖在繼續運行的同時在後臺啓動進程(在這種情況下,您是否想從進程中獲取信號)?你只是想抓住一個過程的輸出並放入一個文件?您正在運行的進程是否運行很長時間? – Uri

+0

@ Uri.You是對的我只是想要運行一個後臺進程。我只需要退出進程並繼續執行下一個語句。我甚至不需要在進程運行後返回任何東西! – Vijay

回答

1

我很確定你不能在這上面使用尾隨&。如果您希望程序在命令運行時繼續運行,則fork並讓子進程運行該調用,然後退出。可能exec可以做到這一點,雖然我還沒有嘗試過這樣做,輸出重定向之前...

+0

如果你想背景的過程叉肯定是要走的路。 – SkryneSaver

+0

我已經把控制檯和日誌文件放在一起。如果我想抑制輸出到控制檯,我使用'>&file&'。這就是爲什麼我需要使用&符號的原因。甚至嘗試用叉子運行良好,但它將輸出引發到控制檯。如果我使用'&gt'和'&',那麼即使分叉也沒有幫助,因爲它再次拋出錯誤號碼錯誤。 – Vijay

+0

所以問題是,你想捕獲進程的STDERR和STDOUT並將它們重定向到文件? – SkryneSaver

0

就像消息說,這不是一個有效的sh命令。這可能是一個csh命令?

system('csh', '-c', $cmd); 
-1

試試這個:

perl -e "`cat myfile.txt>&mytemp.txt&`;" 

它執行命令並返回命令的輸出。 所以這是可以做到的:

#!/usr/bin/perl 
my $content = `cat /etc/passwd`; 
print $content; 

如果你把代碼放到一個Perl腳本:

cat-test.pl

#!/usr/bin/perl 

use strict; 
use warnings; 

my $res = `cat myfile.txt>&mytemp.txt&`; 
+0

您是否嘗試過'cat myfile.txt>&mytemp.txt&放入您的perl腳本? – Vijay

+0

是的,我試過了,它工作正常。 –