VARをサブシェルから親シェルにエクスポートする方法


10

Kornシェルスクリプトがあります

#!/bin/ksh
# set the right ENV
case $INPUT in
abc)
  export BIN=${ABC_BIN}
  ;;
  def)
  export BIN=${DEF_BIN}
  ;;
  *)
  export BIN=${BASE_BIN}
  ;;
esac
# exit 0 <- bad idea for sourcing the file

現在、これらのVARはサブシェルでのみエクスポートされていますが、親シェルでも設定したいので、プロンプトでこれらの変数が正しく設定されています。

私は知っています

. .myscript.sh

しかし、「調達」せずにそれを行う方法はありますか?ユーザーが「ソース」を忘れることが多いため。


EDIT1:「exit 0 "部分を削除する-これは私が最初に考えることなくタイプしただけでした

EDIT2:なぜ私はこれが必要なのかについての詳細を追加します:開発者は(簡単にするために)2つのアプリのコードを記述します:ABCとDEF。すべてのアプリは、別々のユーザーusrabcとusrdefによって運用環境で実行されているため、アプリ固有の$ BIN、$ CFG、$ ORA_HOMEなどをセットアップしています。

そう

  • ABCの$ BIN = / opt / abc / bin#上記のスクリプトの$ ABC_BIN
  • DEFの$ BIN = / opt / def / bin#$ DEF_BIN

現在、開発ボックスでは、開発者は自分のユーザーアカウント 'justin_case'でABCとDEFの両方を同時に開発できます。また、ENV変数の設定を相互に切り替えられるように、ファイル(上記)をソースとして作成します。($ BINは一度に$ ABC_BINを指す必要があり、その後$ BIN = $ DEF_BINに切り替える必要があります)

これで、スクリプトは同じアプリの並行開発などのために新しいサンドボックスも作成する必要があります。これにより、サンドボックス名などを求めてインタラクティブに行うことができます。

  • / home / justin_case / sandbox_abc_beta2
  • / home / justin_case / sandbox_abc_r1
  • / home / justin_case / sandbox_def_r1

私が検討した他のオプションは、エイリアスを作成してすべてのユーザーのプロファイルに追加することです

  • エイリアス 'setup_env =。.myscript.sh '

そしてそれを実行する

  • setup_env parameter1 ... parameterX

これは今ではもっと理にかなっています


はい-これはエイリアスまたは関数(私は関数の方が好きです)でこれを行うことができます。ここで、関数prod(){export VAR = snoopy; }; そして、関数dev(){export VAR = woodstock; };
クリス

回答:


11

「できない」問題だと思います...

まず、最後に出口0があるため、そのスクリプトをソースにしたくありません。

次に、UNIXの子プロセスが親の環境を直接変更することはできません。そうでなければ、あらゆる種類のクレイジーなことが可能になります。

デフォルトのプロファイルまたはbashrcファイルを使用して環境に何かを追加したり、実行しようとしているプログラムのラッパーを作成したりできますか?

「ラッパー」の概念について詳しく説明します。

プロダクションと開発のどちらを行うかに応じて、環境変数「OPTIONS」でPRODまたはDEVを使用してプログラムsnoopyを実行するとします。それが設定されていない場合、スヌーピーが本番と開発のためにデータベースを一掃するなど、何かおかしなことをするとしましょう...

「snoopy」の名前をsnoopy.bin(または.snoopy.bin)に変更します

次に、スクリプトを「snoopy」という同じ場所に配置します。

#!/bin/sh

export OPTIONS

case "$OPTIONS" 
in
  PROD) ;;
  DEV) ;;
  *) OPTIONS=DEV ;;
esac

#the binary is actually named snoopy.bin 

exec "$0.bin" "$@"

実際のファイルをいじりたくない場合は、このスクリプトをファイルシステムのどこかに配置します。このスクリプトは、ユーザーのPATHにある実際のスヌーピープログラムの前にあり、スクリプトのexecステートメントにバイナリへの完全パスがあります。


5

答えは調達です。ソーシングを使用すると、現在のシェルのスクリプトに変数を含めることができますが、その親にすることはできません。それはあなたの現在のシェルを閉じるので、それは本当です、あなたはどんなexitコマンドまたは類似のものも使わないように注意しなければなりません。

「。」を使用してスクリプトを調達できます。つまり、

。./myscript.ksh



3

たぶんあなたがしようとすると...

#!/bin/bash

mknod fifo p

(
       echo 'value' > fifo &
)

VARIABLE=`cat fifo`
rm fifo

これは厳密に変数のエクスポートではありませんが、親プロセスとの基本的な通信を提供できます。


1

OK、今は笑わないで。非常に迅速で非常に汚い解決策は追加することです

echo "Please copy and paste this command:"
echo ""
echo "export BIN=\"$BIN\""

あなたのスクリプトに。

別のアプローチ。ただ、exec多分別のプロンプト(彼らは混乱を軽減するために作業している環境下で、ユーザーに通知するための変更$ PS1)を使用して、スクリプト内の下位$ SHELL、。

別のアプローチ(私のお気に入り)。ユーザーがスクリプトのソースを忘れたのはなぜですか?ソーシングはまさに標準的な方法です。それらを思い出させる良い方法は、最初の行(#!/bin/sh)を削除してからそれを削除することでしょうchmod a-x。その後も引き続き入手できますが、誤って実行することはできません。

Rant:結局のところ、そもそもおかしな考えを持っていたと思います。たぶん奇妙ではない...私はやや非Unixのスタイルで言うでしょう。私は自分の生活の中で親に環境をエクスポートする必要はありませんでした。私はかつて同じような状況を見ました-ログイン.profileが3つの異なる環境のどれに単一のoracleアカウントを設定するかを尋ねました。悪い考えですが、結局のところ、ユーザーはsudoへの移行を好むことがわかりました(3つの異なるoraxxxアカウントにsudoを実行した)。私が尋ねるなら、あなたは何を達成しようとしていますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.