2010-04-26 16 views
16

Chúng tôi có Oracle đang chạy trên Solaris và trình bao theo mặc định là csh. Vì vậy, kịch bản đăng nhập đặt oracle_home, oracle_sid trong csh. Nhưng tôi không thích csh và muốn sử dụng bash để làm công việc của tôi. Vì vậy, làm thế nào để nguồn kịch bản đăng nhập csh trong bash?cách mã nguồn csh script trong bash để thiết lập môi trường

ví dụ: sau đây là nội dung trong tệp .cshrc. Và khi sử dụng bash, tôi muốn sử dụng các biến này. Một cách là sao chép các biến một lần nữa và sử dụng lệnh bash, chẳng hạn như xuất ORACLE_SID = TEST. Nhưng làm như vậy sẽ yêu cầu chúng tôi duy trì hai bản sao của các tập tin. Và khi chúng tôi thay đổi tên cơ sở dữ liệu, hoặc nâng cấp cơ sở dữ liệu, tôi cần duy trì riêng biệt tệp đăng nhập bash. Thật tuyệt khi chỉ sử dụng một cái gì đó như

nguồn .cshr trong bash, nhưng nó không hoạt động.

 
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" 
+1

Thích hợp hơn cho Siêu người dùng hoặc Lỗi máy chủ? – sblom

Trả lời

17

Trong ~/.bashrc của bạn (hoặc là người đầu tiên của ~/.bash_profile, ~/.bash_login, và ~/.profile rằng tồn tại) nguồn kịch bản này sử dụng một cái gì đó giống như . ~/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 

Phiên bản này loại bỏ sự ác 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 
) 

Chỉnh sửa:

Nếu không có nguồn stdin:

while read cmd var val 
do 
    if [[ $cmd == "setenv" ]] 
    then 
     declare -x "$var=$val" 
    fi 
done < cshrc 
+0

@ Dennis - nice ... Tôi thích cái này vì nó là bash thuần túy (tôi sử dụng 'sed') ... Tôi phải thừa nhận rằng tôi vẫn thích phiên bản của tôi (khá giống nhau) chủ yếu vì nó giữ danh sách các lệnh đã đặt như một tập tin để khắc phục sự cố sau này hoặc phục hồi môi trường chỉ trong trường hợp :) – DVK

+1

Tôi sẽ bỏ phiếu cho phiên bản đầu tiên - tìm nguồn cung ứng stdin ít nhất là dễ bị rắc rối như 'eval'. –

1

Cách duy nhất tôi có thể nghĩ để làm điều đó là tải csh và sau đó gọi bash từ trình bao mới đó. Bằng cách đó csh có thể phân tích cú pháp tệp đó, và sau đó bash mà nó sinh ra sẽ thừa hưởng môi trường đó.

+0

Trong mã: '(cat .cshrc; echo exec $ SHELL) | csh' – reinierpost

-4

Tìm nguồn cung cấp tệp csh trong bash sẽ không hoạt động. Bạn có thể thay đổi shell đăng nhập mặc định từ csh thành bash nếu bạn có nhiều confortable trong bash. Bạn có thể sử dụng chsh hoặc làm quản trị viên để thay đổi nó cho bạn.

chsh -s /usr/local/bin/bash 
2

Trong bash bạn .profile, bạn có thể làm như sau:

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

Nó cũng mát mẻ, tôi không muốn tạo một số tập tin rác. Bạn không chắc chắn liệu chúng ta có thể sử dụng đường ống để tránh tệp tạm thời không. – Daniel

+1

Sử dụng vô dụng 'cat'. Bash không sử dụng 'set' theo cách đó. 'export' có thể lấy tên biến và gán tất cả cùng một lúc. Bạn phải sử dụng một phiên bản 'sed' khác vì nó trông giống như cú pháp Perl. Bạn cần sử dụng '-r' hoặc thoát khỏi dấu ngoặc đơn và dấu cộng.Bạn có thể loại bỏ các tập tin tạm thời như thế này: 'source/dev/stdin <<(sed 's/setenv \ s \ + \ (\ S \ + \) \ s \ + \ (. * \) $/Export \ 1 = \ 2/'.cshrc) ' –

+0

@Dennis và Daniel - Tôi thường ** muốn ** tập tin tạm thời" rác "đó :) – DVK

-1

Chỉ cần có một "#!/bin/tcsh" hoặc tuyên bố tương tự có sẵn vào lúc bắt đầu của CSH kịch bản kết hợp với việc thực thi tập lệnh đã giải quyết được vấn đề cho tôi. Tôi có thể gọi trực tiếp kịch bản CSH từ bash trong trường hợp này.

Ví dụ, tôi phải chạy tools.csh từ tập lệnh bash có tên là setup.sh. Tôi đã làm một cái gì đó như thế này trong kịch bản bash:

if [ -z \`head -1 tools.csh | grep '^#!'\` ]; 
then 
    TCSH=\`which tcsh\`; 
    echo "'#!'$TCSH" > tools.csh.temp; 
    cat tools.csh >> tools.csh.temp; 
    mv tools.csh.temp tools.csh; 
fi; 
chmod 755 tools.csh; 
./tools.csh 
# now I have all the setenv commands effective ... 
+1

Nếu './Tools.csh' đặt biến môi trường, chúng * sẽ không * hiển thị từ trình bao gọi. Nếu các lệnh phụ thuộc vào các biến môi trường đó là tất cả trong './Tools.csh', thì đó là ok. –

2

Làm thế nào về chỉ định một chức năng gọi là setenv, như vậy

setenv() { 
    echo setting $1 to $2 
    export $1=$2 
} 

và sau đó tìm nguồn cung ứng các tập tin cshrc.

Khi tôi làm điều này trong bash, tôi nhận được

[[email protected] 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 
[[email protected] ual-read-only]$ env | grep ORACLE 
ORACLE_SID=TEST 
ORACLE_HOME=/oracle/TEST/home/products/10204 
+0

Đóng nhưng không có xì gà. (1) một số kịch bản nguồn csh đặt bí danh - và tôi không biết cách xuất khẩu bí danh từ csh trở lại vỏ gọi như bash. Tôi cho rằng nó chỉ là một vấn đề đơn giản của lập trình để dịch bất kỳ bí danh csh nào thành một bí danh bash, và ngược lại (cái sau để gọi các kịch bản nguồn csh mới). (2) vì vỏ đăng nhập thông thường của tôi có các biến encvironmenht thêm, trước tiên tôi cần phải dọn sạch nó. Và đây là điều tôi đang hỏi. (3), oh, chỉ cần nhận thấy chính xác những gì bạn đang làm: có, tôi đã có một setenv trong bash trong nhiều năm nay. (Trên thực tế, kể từ trước bash tồn tại, trong ksh.) –

4

tôi trong cùng một thuyền.Một đồng nghiệp chỉ cho tôi như sau:

Bắt đầu trong bash, mà không cần những thứ trong thwe môi trường:

bash> echo $$ 
12632 
bash> echo $FOO 

Dưới đây là file csh đó được source'd:

bash> cat setup-env.csh 
setenv FOO "some csh stuff" 
echo FOO=$FOO in csh 

Đây là lệnh :

bash> csh -c 'source setup-env.csh;exec bash' 

Nhìn vào đầu ra từ csh

FOO=some csh stuff in csh 

Và nhìn vào sản lượng từ bash shell mới

bash> echo $$ 
    13487 
    bash> echo $FOO 
    some csh stuff 

Bây giờ ra đi, và quay trở lại với vỏ bash gốc

bash> exit 
exit 
bash> echo $$ 
12632 
bash> 

Note echo $$ để xem quá trình này ID, để chúng ta có thể thấy chúng là các quá trình shell khác nhau.

đồng nghiệp của tôi sử dụng đủ này mà ông đặt nó vào một bí danh, như:

# 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 

Thật không may, tôi đã thấy rằng tôi thường cần không thiết lập biến chỉ môi trường, mà còn là bí danh thiết lập, như trong các module gói http://modules.sourceforge.net/.

Tôi đã có thể tự động hóa "công thức nấu ăn tập lệnh nguồn csh" này bằng cách sử dụng Perl Expect. Nhưng tôi đã không thể tương tác như tôi muốn, ngoại trừ những điều trên.

+0

Tôi là một fan hâm mộ lớn của các gói mô-đun và tôi ngạc nhiên nhiều người hơn không sử dụng nó. Làm cho mọi thứ trở nên bất khả tri chỉ là một điều tốt đẹp để làm. – stephenmm

0

Đối với một cái gì đó nhỏ, nó phổ biến để duy trì hai kịch bản thiết lập, một cho sh và sh-có nguồn gốc, vỏ, và một cho csh và tcsh. Như bạn đề cập, điều đó sẽ tạo ra nguy cơ của hai tập lệnh không đồng bộ hóa - trừ khi bạn tạo cái này từ cái kia hoặc tạo cả hai từ một nguồn chung.

Điều này đặt gánh nặng lên người duy trì (các) tập lệnh thiết lập thay vì trên mỗi người dùng cần sử dụng chúng.

0

Có một mô-đun có sẵn để bạn có thể nguồn cùng một tệp nơi bạn muốn trong tập lệnh perl. Và bạn sẽ nhận được tất cả các đường dẫn môi trường có sẵn trong tệp csh của bạn.

Source::Shell 

Đi qua một tài liệu nhỏ để sử dụng.

Các vấn đề liên quan