OracleはSolaris上で実行されており、シェルはデフォルトでcshです。そのため、ログインスクリプトは、cshにもOracle_home、Oracle_sidを設定します。しかし、私はcshが好きではないので、bashを使用して自分の仕事をしたいと考えています。それでは、bashでcshログインスクリプトを入手する方法は?
たとえば、.cshrcファイルの内容は次のとおりです。また、bashを使用する場合は、これらの変数を使用します。 1つの方法は、変数を再度コピーして、export Oracle_SID = TESTなどのbashコマンドを使用することです。ただし、これを行うには、ファイルの2つのコピーを保持する必要があります。データベース名を変更したり、データベースをアップグレードしたりするときは、bashログインファイルを個別に保持する必要があります。次のようなものを使用するのはいいことです
ソース.cshrはbashですが、機能しません。
setenv Oracle_SID TEST setenv Oracle_HOME /Oracle/TEST/home/products/10204 setenv EPC_DISABLED TRUE setenv MANPATH/usr/local/man:/ usr/share/man setenv EDITOR vi setenv LD_LIBRARY_PATH $ Oracle_HOME/lib:/ usr/sfw/lib/64 setenv NLS_LANG AMERICAN_AMERICA.UTF8 setenv NLS_DATE_FORMAT "DD -MON-RR "
~/.bashrc
(または存在する最初の~/.bash_profile
、~/.bash_login
、および~/.profile
)で、. ~/bin/sourcecsh
のようなものを使用してこのスクリプトを入手します。
#!/bin/bash
# This should be sourced rather than executed
while read cmd var val
do
if [[ $cmd == "setenv" ]]
then
eval "export $var=$val"
fi
done < ~/.cshrc
このバージョンは悪を排除しますeval
:
#!/bin/bash
# This should be sourced rather than executed
# yes, it will be sourcing within sourcing - what so(u)rcery!
source /dev/stdin < \
<(
while read cmd var val
do
if [[ $cmd == "setenv" ]]
then
echo "export $var=$val"
fi
done < cshrc
)
編集:
Stdinを調達しない場合:
while read cmd var val
do
if [[ $cmd == "setenv" ]]
then
declare -x "$var=$val"
fi
done < cshrc
私は同じ船に乗っています。同僚が私に次のことを示しました。
環境内のものを使わずに、bashから始めます。
bash> echo $$
12632
bash> echo $FOO
これは、sourcedされるcshファイルです。
bash> cat setup-env.csh
setenv FOO "some csh stuff"
echo FOO=$FOO in csh
コマンドは次のとおりです。
bash> csh -c 'source setup-env.csh;exec bash'
Cshからの出力を見てください。
FOO=some csh stuff in csh
新しいbashシェルの出力を見てください。
bash> echo $$
13487
bash> echo $FOO
some csh stuff
そのままにして、元のbashシェルに戻ります
bash> exit
exit
bash> echo $$
12632
bash>
エコー$$に注目してプロセスIDを確認し、それらが異なるシェルプロセスであることを確認します。
私の同僚はこれを十分に使用して、次のようにエイリアスに入れています。
# make csh environment scripts useable (sourceable) from bash function
# from Phil McCoy, Wed Nov 9 2011
source_csh () {
exec csh -c " source $*; setenv ALREADY_SOURCED \"$ALREADY_SOURCED:$*:\"; exec bash"
}
# sounds like a great idea to do source_csh .cshrc or .login
# but naively done is infinitely recursive,
# since the exec'ed bash will run .bashrc
残念ながら、モジュールパッケージ http://modules.sourceforge.net/ のように、環境変数のセットアップだけでなくエイリアスのセットアップも必要になることがよくありました。
Perl Expectを使用して、この「cshソーススクリプトレシピ」を自動化できました。しかし、上記を除いて、希望するほどインタラクティブにすることができませんでした。
次のように、setenvという関数を定義するだけではどうでしょうか。
setenv() {
echo setting $1 to $2
export $1=$2
}
そして.cshrcファイルを調達します。
これをbashで行うと、
[dws@oxygen ual-read-only]$ source cshrc
setting Oracle_SID to TEST
setting Oracle_HOME to /Oracle/TEST/home/products/10204
setting EPC_DISABLED to TRUE
setting MANPATH to /usr/local/man:/usr/share/man
setting EDITOR to vi
setting LD_LIBRARY_PATH to /Oracle/TEST/home/products/10204/lib:/usr/sfw/lib/64
setting NLS_LANG to AMERICAN_AMERICA.UTF8
setting NLS_DATE_FORMAT to DD-MON-RR
[dws@oxygen ual-read-only]$ env | grep Oracle
ORACLE_SID=TEST
Oracle_HOME=/Oracle/TEST/home/products/10204
あなたのbashで.profile
、次のことができます。
cat .cshrc | sed 's/setenv\s+(\S+)\s+(.*)$/set $1=$2; export $1/' > $HOME/.env_from_csh
source $HOME/.env_from_csh
私ができると思う唯一の方法は、cshをロードしてから、その新しいシェルからbashを呼び出すことです。そうすれば、cshはそのファイルを解析し、それが生成するbashもその環境を継承します。
Perlスクリプトのどこにいても同じファイルを入手できるモジュールが利用可能です。そして、cshファイルで利用可能なすべての環境パスを取得します。
Source::Shell
使い方については、小さなドキュメントをご覧ください。
小さなものでは、2つのセットアップスクリプトを維持するのが一般的です。1つはshとsh派生のシェル、もう1つはcshとtcshです。おっしゃるように、2つのスクリプトが同期しなくなるリスクがあります-nless一方から他方を生成するか、共通のソースから両方を生成します。
これは、設定スクリプトを使用する必要がある各ユーザーではなく、設定スクリプトの管理者に負担をかけます。