2017-06-15 51 views
2

我有一個別名:在猛砸別名有條件中止

alias local='if [ -z "${FUNCNAME[0]}" ]; then builtin local; fi; declare' 

,我要使用本地命令重定向到我的修改聲明函數,然後可以聲明變量,只有使用builtin local獲得錯誤消息如果在函數之外。

別名(使用一套-x)的輸出:

+ '[' -z '' ']' 
+ builtin local 
-bash: local: can only be used in a function 
+ declare 

現在它反正執行declare,我想它如果檢查失敗退出。我不能使用這個功能。

到目前爲止,我已經試過回報,突破和退出(退出不是在這裏的原因很明顯):

alias 'local=if [ -z "${FUNCNAME[0]}" ]; then builtin local; return 1; break; fi; declare' 

+ '[' -z '' ']' 
+ builtin local 
-bash: local: can only be used in a function 
+ return 1 
-bash: return: can only `return' from a function or sourced script 
+ break 
-bash: break: only meaningful in a `for', `while', or `until' loop 
+ declare 

例子:

# When outside an function 
local some_var=val 
+ '[' -z '' ']' 
+ builtin local 
-bash: local: can only be used in a function 
# That's it 

# When inside an function func 
local some_var=val 
+ '[' -z func ']' 
+ declare some_var=val 
# Uses my modified declare function 
+0

您是否試圖隱藏「本地」關鍵字?無論如何,如果你不希望它每次都運行,爲什麼不把'declare'放在'else'塊中呢? –

+2

不是'local:只能用在一個函數中'解釋一下嗎?不要這樣做! ;-)任何需要變量參數的東西都應該寫成一個函數。祝你好運。 – shellter

+0

@Eric Renouf如果我把聲明放在一個else塊中,它將無法聲明變量,請參閱我的更新。 – BonBon

回答

1

由於builtin local只是用來得到錯誤信息,這將工作:

alias local='builtin local 2>&1 >/dev/null; [ -n "${FUNCNAME[0]}" ] && declare' 

它總是隻打印錯誤,如果沒有一個函數裏面,但韓元「T打印出所有好像裏面一個局部變量:

$> func() { local var2=foo; local var=bar; echo $var; } 
$> func 
+ func 
+ builtin local 
+ '[' -n func ']' 
+ declare var2=foo 
+ builtin local 
+ '[' -n func ']' 
+ declare var=bar 
+ echo bar 
bar 

這樣地方得到由申報代替,然後我可以用一個包裝進行修改。

1

不知道爲什麼你需要這樣的別名。無論如何,請勿爲此使用別名。使用的函數:

local() { 
    if [ -z "${FUNCNAME[0]}" ]; then 
    builtin local "[email protected]" 
    else 
    declare -g "[email protected]" # -g (for global) is necessary - otherwise variable set by declare would be local to the function 
    fi 
} 
+0

我很確定函數內的函數不能生成全局變量,你能證實嗎? – BonBon

+0

-g在函數內部工作 – codeforester

+0

現在,它總是返回true,因爲它位於名爲'local'的函數中 – BonBon