2015-03-25 60 views
0

我想要一個陷阱只在整個shell腳本終止時執行。我寫了下面的shell腳本。如何僅在AIX 5.3上以ksh結束整個腳本時執行陷阱?

foo() 
{ 
    echo begin foo 
    trap 'echo TRAP' EXIT 
    echo end foo 
} 

bar() 
{ 
    echo begin bar 
    echo end bar 
} 

foo 
bar 

在我的AIX 5.3系統上,它在bash和ksh93中產生所需的輸出。陷阱是在下面的例子中最後要執行的事情。

# bash foo.sh 
begin foo 
end foo 
begin bar 
end bar 
TRAP 

# ksh93 foo.sh 
begin foo 
end foo 
begin bar 
end bar 
TRAP 

但在ksh上,陷阱在函數foo退出時執行。

# ksh foo.sh 
begin foo 
end foo 
TRAP 
begin bar 
end bar 

我能做些什麼來執行我的陷阱只有在ksh腳本的終止?

+1

在函數之外聲明它。 – tripleee 2015-03-25 11:30:30

+1

爲什麼你需要在這麼多不同的shell下運行你的腳本?如果它在* ksh93 *和* bash *中產生所需的結果,爲什麼不堅持使用其中一個解釋器? – Kusalananda 2015-05-27 19:30:10

+1

在* ksh93 *,* bash *和* ksh88 *下運行腳本有點像通過C++編譯器運行C程序。有些事情可能會奏效,有些事情可能會破裂。 * ksh88 *和* ksh93 *實現大致相同的核心語言,但存在差異。請參閱此處的列表:http://www.opensource.apple.com/source/ksh/ksh-13/ksh/src/cmd/ksh93/COMPATIBILITY – Kusalananda 2015-05-31 09:09:59

回答

1

的功能作用域已經和ksh93的(大概AIX系統上KSH)改變之間ksh88。引述this list of differences between the two shells

功能,具有name()定義與KSH-93是與 POSIX標準兼容,不能與KSH-88。沒有局部變量是允許的, 並沒有單獨的範圍。使用function 名稱語法定義的函數,保持兼容性。這也影響功能 的痕跡。