2016-11-01 16 views
0

私は、この変数bashプログラミングにファイルスコープはありますか?

local to="$HOME/root_install/grunt" 

はバッシュシェルはすべての変数がすべてと呼ばれる機能、コマンド、 などのために利用可能であることを意味しているdynamic scopes を使用

makeGrunt(){ 

    # set paths 
    local to="$HOME/root_install/grunt" 
    cd $to 

    sudo npm install -g grunt-init 
    sudo git clone https://github.com/gruntjs/grunt-init-gruntfile.git ~/.grunt-init/gruntfile 
    sudo grunt-init gruntfile 
} 
+3

単に 'local'キーワードを削除してください – janos

+2

脇に:' cd "$に" ||あなたの 'cd'が失敗すればあなたのスクリプトは' npm install'をいくつかの未知のディレクトリで実行しません。 (http://shellcheck.net/は、 'cdの成功をテストする必要性についてのアドバイスを提供します)。 –

答えて

1

ファイル全体が利用できるようにしたいですこれを考慮する:

var=1 
a() { 
    local var=2 
    b 
} 
b() { 
    echo "$var" 
} 
a # 2 
b # 1 
a # 2 

localキーワードは、定義されている の関数で使用可能になりますが、その関数から呼び出されるすべての関数内でも使用できます。

localキーワードを付けずに変数を作成した場合も同様です。 を使用すると、その機能の外でも利用可能になります。

もう1つ注意しなければならないのは、サブシェルが作成されるたびに、変数 はパイプを「離れる」ことができなくなります。このことを考えてみましょう:

sum=0 
seq 3 | while read -r num; do 
    sum=$((sum + num)) 
    echo "$sum" # will print 1, 3 and 6 
done 
echo "$sum" # 0 huh? 1 + 2 + 3 = 0? 
2

POSIXのようなシェルでは - あなたは、このようなlocaltypeset、またはdeclareなど非標準構文を使用しない限り - を作成変数暗黙的 割り当てによってグローバルスコープを持っています手元の殻に。あなたが関数の内部でない限り、その変数を明示的にがローカルとしてマークだった - このよう

to="$HOME/root_install/grunt"は、現在のシェルでどこでも$to変数を利用できるようになります。サブシェルがクローン元のシェルのあるプロセスです - -

andlrc's helpful answerサブシェルに関連した落とし穴を実証彼らは同じ状態を見ますが、は、元のシェルの環境を変更することはできません。

関連する問題