1. ホーム
  2. bash

[解決済み] cshスクリプトをbashでソースして環境を設定する方法 [終了しました]。

2022-02-18 05:44:10

質問内容

Solaris上でOracleが動作しており、シェルはデフォルトでcshが使用されています。そのため、ログインスクリプトでは、cshでoracle_home, oracle_sidも設定しています。しかし、私はcshが好きではないので、bashを使って仕事をしたいのです。だから、どのようにbashでcshのログインスクリプトをソースにするのですか?

例えば、.cshrc ファイルには以下のように記述されています。そして、bashを使うときに、これらの変数を使いたいのです。一つの方法は、export ORACLE_SID=TESTのように、変数を再度コピーして、bashコマンドを使用することです。しかし、そうすると、ファイルのコピーを2つ維持する必要があります。それに、データベース名を変更したり、データベースをアップグレードしたりすると、bashのログイン・ファイルを別に管理する必要があるんだ。のようなものを使うだけでいいんです。

source .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