2012-12-10 27 views
1

我遇到了一些代碼問題,我想知道是否有人可以提供幫助。在反引號命令中使用管道

基本上我試圖對數據庫執行查詢ISQL並將其分配給一個標量。 isql命令使用定義爲管道符號的列分隔符。

所以我把它建立這樣:在隔離

my $command = "isql -S -U -s| -i"; 
my $isql_output = `$command`; 

isql命令的作品,但在作爲反引號發出停靠在管。我試過使用子字符串連接$command字符串,使用單引號和反斜槓轉義項,如-s\"\|\"無濟於事。我也嘗試使用qx而不是反引號。

不幸的是我目前用perl(v5.6.1)與升級範圍有限的舊版本,所以我不知道如果我能解決這個問題。

回答

4

你必須引用|的方式,外殼不承認它作爲一個特殊字符。兩種方式:

  1. -s|放入單引號:'-s|'。 Perl會將單引號放在雙引號字符串中,並將它們傳遞給未修改的shell。 -s\\|
  2. 以兩個反斜槓逃離|。爲什麼兩個?第一個是由Perl看到它告訴它通過未經修改的下一個字符。因此shell會看到-s\|並執行一些非常類似的操作:它看到單個的\,並且知道不會處理下一個字符,即|,特殊字符。
+0

感謝您的回覆莫里茨。但是,如果我使用單引號,則會出現'''未被識別爲內部或外部命令的錯誤。如果我使用雙反斜槓,則會聲明'-ixxx'不被識別爲內部命令tc。打印$命令顯示文本中的單個反斜槓。 – user1891588

+1

@ user1891588對答案有幫助嗎?如果是這樣,您應該點擊左側的綠色箭頭接受它。 – MattLBeck

+0

@ user1891588:好的,如果您需要進一步的幫助,請複製並粘貼您已更改的內容,哪些內容仍不起作用。我無法讀懂頭腦。 –

0

單引號應該工作。嘗試運行測試perl腳本:

my $cmd = "./test.sh -S -U -s '|' -i"; 
print `$cmd`; 

隨着test.sh:

#!/bin/sh 

echo [email protected] 

輸出應該是-S -U -s | -i

+0

我得到相同的錯誤。打印$命令會輸出單引號,但反引用會給我一個'''錯誤,它不會被識別爲內部或外部命令。 – user1891588

1

的問題是,正在通過一個shell執行的命令。 您可以通過傳遞列表中的命令和參數而不是單個字符串來避免這種情況。 反標結構不支持,所以你需要使用open()函數。 我沒有測試過下面的代碼,但它給人的想法:

my @command = (qw(isql -Sserver -Uuser -Ppassword -s| -w4096), '–i' . $file); 
print join(' ', @command), "\n"; 
open(my $fh, '-|', @command) 
    or die "failed to run isql command: [email protected]\n"; 
my @isql_output = <$fh>; 
close($fh); 
my $isql_output = $isql_output[0]; chomp($isql_output); 

如果你有一個15歲的Perl版本的工作(甲骨文用戶傾向於做),我不知道這會全部得到支持。例如,您可能需要編寫chop而不是chomp

更新:這個問題是不是Perl版本,但這種結構不被支持Windows,according to the documentation。這必須是合格的:我在Cygwin上使用Perl,它在那裏工作得很好,但我不知道你是否可以使用Cygwin。

+0

感謝您的回覆,但是,它不工作。不能將未定義的值用作看起來與版本相關的文件句柄引用。 – user1891588

+0

奇怪...如果$ fh未定義,它應該有'die()'d。確保你用'strict strict'開始你的腳本;使用警告;'檢測未定義變量的其他問題。 – reinierpost

+0

我應該在發佈這個答案之前閱讀perlopentut ... – reinierpost