2016-09-14 16 views
0

envとstart.envは、どのシェルでも実行する必要があります。 実際にenv変数の設定が期待通りに動作しないKORNを除いて、実際にはあります。だから例を見てください。kornシェルと環境変数

ファイルset.env:

#!/bin/bash 
export MY_VAR="home" || setenv MY_VAR "home" 

ファイルstart.sh:

#!/bin/bash 
command . ./set.env || source set.env 
echo "$MY_VAR" 

私は変数のプリントを見ることができます。 kshのターミナルでエコーしようとすると、定義されていません。

私のセッションでは$ MY_VARが見込まれます...アイデアはありますか? //赤い帽子で実行

+0

'setenv'はcshです。完全に非POSIX準拠のシェルをサポートする必要がありますか、POSIX sh(ダッシュ、灰色、&c)、ksh、およびbashで十分ですか? –

+0

ところで、実際に使っているkshは?たとえば、mkshの場合、それはDavid-Kornが実際に書いたkshではありません。 –

答えて

4

start.shを実行すると、サブコマンドとして実行しています。したがって、環境変数に対する変更は、そのプロセスとその子プロセスに適用されます。一度プロセスが終了すると、それが設定された環境変数はそれと共に消滅します。あまり移植性、

# this works on any POSIX shell, including ksh (and bastardizations such as mksh) 
. start.sh 

...または:

は移植性あなたの現在のシェルでそれを実行するため、そのシェル内の環境変数を設定し、スクリプトをソースに、実行

# this is a bashism 
source start.sh 

実際には、command . ./set.envは奇妙です。 commandはシェル関数の実行を防ぎますが、.という名前の関数が定義されている環境は、間違いなくバグの多い環境です。 . start.shだけを考えてください。

+0

'source'はもともとBashにインポートされたCシェルのismです。 –

+0

私は$ start.shの代わりに を理解しました、$でなければなりません。 start.sh。 は、そこから変数を使用するためにstart.shで "source"したいenvファイルと混同しています。 start.shから "source set.evn"を呼び出すと、start.shのコンテキストでも変数が表示されません。 – magulla

+1

'。すべてのPOSIXシェルに移植したい場合は、 'source set.env'ではなく、' set.env'を使用してください。 –