web-dev-qa-db-ja.com

環境を設定するためにbashでcshスクリプトを入手する方法

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 "
18
Daniel

~/.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
17

私は同じ船に乗っています。同僚が私に次のことを示しました。

環境内のものを使わずに、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ソーススクリプトレシピ」を自動化できました。しかし、上記を除いて、希望するほどインタラクティブにすることができませんでした。

4
Krazy Glew

次のように、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
4
Dave Wade-Stein

あなたのbashで.profile、次のことができます。

cat .cshrc | sed 's/setenv\s+(\S+)\s+(.*)$/set $1=$2; export $1/' > $HOME/.env_from_csh
source $HOME/.env_from_csh
2
DVK

私ができると思う唯一の方法は、cshをロードしてから、その新しいシェルからbashを呼び出すことです。そうすれば、cshはそのファイルを解析し、それが生成するbashもその環境を継承します。

1
sblom

Perlスクリプトのどこにいても同じファイルを入手できるモジュールが利用可能です。そして、cshファイルで利用可能なすべての環境パスを取得します。

Source::Shell

使い方については、小さなドキュメントをご覧ください。

0
Mak_Thareja

小さなものでは、2つのセットアップスクリプトを維持するのが一般的です。1つはshとsh派生のシェル、もう1つはcshとtcshです。おっしゃるように、2つのスクリプトが同期しなくなるリスクがあります-nless一方から他方を生成するか、共通のソースから両方を生成します。

これは、設定スクリプトを使用する必要がある各ユーザーではなく、設定スクリプトの管理者に負担をかけます。

0
Keith Thompson