2017-06-15 2 views
2

私は別名を持っている:私は、変数を宣言することができ、かつ唯一取得するbuiltin localを使用した私の修正宣言機能、に地元のコマンドをリダイレクトするために使用したいは条件付きバッシュの別名で中止

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

関数の外部にある場合はエラーメッセージ。

エイリアスが(-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

'local'キーワードをシャドーしようとしていますか?とにかく、毎回実行したくない場合は、 'else'ブロックに' declare'を入れてみませんか? –

+2

'local:関数でのみ使用できます'説明していませんか?それをしないでください! ;-)可変引数を取ろうとしているものは、関数として記述する必要があります。がんばろう。 – shellter

+0

@Eric Renouf宣言をelseブロック内に置くと、変数を宣言することができなくなります。私の更新を見てください。 – BonBon

答えて

1

のみエラーメッセージを取得するために使用され、これは動作します:

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

それは常に関数内でない場合は、エラーのみを印刷しますが、ウォンます

$> 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

わかりません。いずれにしても、エイリアスは使用しないでください。代わりに関数を使用してください:builtin localとして

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

これは今では 'local'という名前の関数の内部にあるため、常にtrueを返します – BonBon