web-dev-qa-db-ja.com

関数内から変数をエクスポートすることは、その変数のグローバルエクスポートと同じですか?

ネイティブBashを備えたUbuntu 16.04を使用しています。

実行するかどうかわからない

#!/bin/bash
myFunc() {
    export myVar="myVal"
}
myFunc

どんな意味でも、単にexport myVar="myVal"

もちろん、グローバル変数は通常、関数の外で宣言する必要があります(技術的に可能であっても、私が想定する慣例の問題です)。非常に一般的な関数を記述し、その中に変数を追加したいという、よりエキゾチックなケースについては疑問に思います。それでも、どこでも、すべてに利用できます。

関数内の変数のexportは、CLIで直接グローバルにエクスポートして、シェル内のすべて(すべてのサブシェル、および関数内)で使用できるようにすることと同じですか?

10
user9303970

スクリプトは、スクリプトの環境に環境変数myVarを作成します。スクリプトは、現在提示されているように、機能的には次のものとまったく同じです。

#!/bin/bash

export myVar="myVal"

exportが関数本体で発生するという事実は、環境変数のスコープには関係ありません(この場合)。関数が呼び出されるとすぐに存在し始めます。

変数は、スクリプトの環境、および関数呼び出しの後にスクリプトから開始された他のプロセスの環境で使用できます。

変数は、スクリプトが(.またはsourceを使用して)供給され、その場合、スクリプト全体がソースになる場合を除き、親プロセスの環境(スクリプトを実行する対話型シェル)には存在しません。対話型シェルの環境で実行されている(シェルファイルを「調達する」目的です)。

関数呼び出し自体なし:

myFunc() {
    export myVar="myVal"
}

thisファイルをソーシングすると、呼び出し元のシェルの環境にmyFuncが配置されます。関数を呼び出すと、環境変数が作成されます。

質問も参照してください シェル変数はどのスコープを持つことができますか?

14
Kusalananda