2011-09-27 71 views
1

我有一個perl腳本(verifyCopy.pl),它使用system()來調用一個shell腳本(intercp.sh)。從一個從腳本內部調用的shell腳本返回一個退出代碼

從shell腳本中,我已經建立了幾個退出的特定退出代碼,我希望能夠根據返回的退出代碼做不同的事情。

我使用$?試過了,我已經試過的system("./intercp.sh")值賦值給一個變量,然後檢查該值,但該錯誤消息始終爲0

這是因爲即使在外殼裏面的東西腳本失敗,實際腳本成功運行?

我試着在shell腳本中添加一個陷阱(即trap testexit EXITtestexit() { exit 222; }但也不能工作。

+0

今天我遇到完全相同的問題,你有沒有找到解決方案? –

回答

0

$?應該從你的shell腳本捕捉退出代碼。

$ cat /tmp/test.sh 
#!/bin/sh 
exit 2 

$ perl -E 'system("/tmp/test.sh"); say $?' 
512 

記住$?以傳統方式編碼,所以$? >> 8給出退出代碼,$? & 0x7F給出信號,$? & 0x80如果核心被轉儲,則爲true。請參閱perlvar以瞭解詳細信息。

你的問題可能是幾件事情之一:也許你的shell腳本實際上並沒有退出代碼(也許你想要set -e);也許你有SIGCHLD吃信號的信號句柄;等等。嘗試使用上面非常簡單的shell腳本進行測試,看看它是否存在perl腳本或shell腳本中的問題。

+0

您使用的是哪個版本的Perl?我只是從上面發佈的代碼中獲得-1:\ – Nick

+0

@Nick:假設'bas; h'是一個錯字,這意味着您的system()調用失敗。你記得'chmod + x/tmp/test.sh'嗎?也打印'$!',它會告訴你爲什麼系統失敗。 – derobert

+0

@Nick:我使用的是5.12.4,但是(在切換後打印出來),這對於任何perl5都可以正常工作,從90年代中期開始一直回到古代。 – derobert

相關問題