2011-11-16 33 views
6

我想從函數內部獲取函數名稱,用於記錄目的。在KornShell腳本中獲取函數名稱

KornShell(KSH)功能:

foo() 
{ 
    echo "get_function_name some useful output" 
} 

有什麼類似$0,它返回腳本名稱腳本中,但是這反而提供了一個函數的名字?

+0

這個問題的題外話:對於bash,使用[FUNCNAME](http://www.gnu.org/software/bash/manual/bashref.html#index-FUNCNAME-193)數組變量。 –

回答

5

使用ksh的 「函數foo ...」 的形式:

$ cat foo1 
#!/bin/ksh 
foo3() { echo "\$0=$0"; } 
function foo2 { echo "\$0=$0"; } 
foo2 
foo3 
$ ./foo1 
$0=foo2 
$0=./foo1 
9

如果定義與function關鍵字的功能,那麼$0是函數名稱:

$ function foo { 
>  echo "$0" 
> } 
$ foo 
foo 

(測試中的pdksh。)

+0

完美,工作正常!使用關鍵字函數的主要優點/缺點是什麼?在我的地方,人們似乎使用ksh88(很難說清楚),但我在腳本中沒有看到一個函數關鍵字 – Dima

+0

@Dima:'function'使得它成爲一個Korn shell函數,它具有'$ 0'。另一種形式適用於System V/POSIX兼容性。 –

5

[...]什麼是使用關鍵字功能的主要優點/缺點?

主要的是,函數內部的「typeset myvar = abc」現在是一個局部變量,函數外面沒有可能的副作用。這使得KSH顯着更安全的大型shell腳本。主要的可能是非POSIX語法。