cara mengekspor VAR dari subkulit ke kulit induk?


10

Saya memiliki skrip shell 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

sekarang VAR ini diekspor hanya dalam subkulit, tapi saya ingin mereka disetel di shell induk saya juga, jadi ketika saya meminta prompt vars itu masih diatur dengan benar.

Saya tahu tentang

. .myscript.sh

tetapi adakah cara untuk melakukannya tanpa 'sumber'? karena pengguna saya sering lupa 'sumber'.


EDIT1: menghapus bagian "keluar 0" - ini hanya saya mengetik tanpa berpikir dulu

EDIT2: untuk menambahkan lebih detail mengapa saya membutuhkan ini: pengembang saya menulis kode untuk (demi kesederhanaan) 2 aplikasi: ABC & DEF. setiap aplikasi dijalankan dalam produksi oleh pengguna terpisah usrabc dan usrdef, maka siapkan $ BIN, $ CFG, $ ORA_HOME mereka, apa pun - khusus untuk aplikasi mereka.

begitu

  • $ BIN ABC = / opt / abc / bin # $ ABC_BIN dalam skrip di atas
  • $ BIN DEF = / opt / def / bin # $ DEF_BIN

dll.

sekarang, di pengembang kotak dev dapat mengembangkan ABC dan DEF pada saat yang sama di bawah akun pengguna mereka sendiri 'justin_case', dan saya membuat mereka sumber file (di atas) sehingga mereka dapat beralih pengaturan var ENV mereka bolak-balik. ($ BIN harus mengarah ke $ ABC_BIN sekaligus dan kemudian saya perlu beralih ke $ BIN = $ DEF_BIN)

sekarang, skrip juga harus membuat kotak pasir baru untuk pengembangan paralel dari aplikasi yang sama, dll. ini membuat saya melakukannya secara interaktif, menanyakan nama kotak pasir, dll.

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

opsi lain yang saya pertimbangkan adalah menulis alias dan menambahkannya ke profil setiap pengguna

  • alias 'setup_env =. .myscript.sh '

dan jalankan dengan

  • setup_env parameter1 ... parameterX

ini lebih masuk akal bagi saya sekarang


Ya - Anda dapat melakukan ini dengan alias atau fungsi (saya lebih suka fungsi sendiri) di mana Anda memiliki fungsi prod () {export VAR = snoopy; }; dan fungsi dev () {export VAR = woodstock; };
chris

Jawaban:


11

Saya pikir itu adalah semacam "tidak bisa melakukan" masalah ...

Pertama - Anda tidak ingin sumber skrip itu karena keluar 0 di akhir.

Kedua, tidak ada proses anak unix yang dapat secara langsung mengubah lingkungan orang tua. Kalau tidak, segala macam hal gila akan mungkin terjadi.

Bisakah Anda menambahkan sesuatu ke lingkungan mereka dengan profil default atau file bashrc, atau bisakah Anda menulis pembungkus untuk program apa pun yang mereka coba jalankan?

Izinkan saya untuk menguraikan konsep "bungkus".

Katakanlah Anda ingin menjalankan program mengintai dengan baik PROD atau DEV dalam variabel lingkungan "PILIHAN" tergantung pada apakah Anda ingin produksi atau pengembangan. JIKA itu tidak diatur, katakanlah snoopy melakukan sesuatu seperti menghapus database untuk produksi dan pengembangan ...

ganti nama "snoopy" menjadi snoopy.bin (atau .snoopy.bin)

lalu letakkan skrip di lokasi yang sama bernama "snoopy" yang berisi ini:

#!/bin/sh

export OPTIONS

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

#the binary is actually named snoopy.bin 

exec "$0.bin" "$@"

Jika Anda tidak ingin mengotori file yang sebenarnya, letakkan skrip ini di suatu tempat di sistem file yang akan mendahului program snoopy yang sebenarnya di PATH pengguna dan memiliki path lengkap ke biner dalam pernyataan skrip exec ...


5

Jawabannya adalah sumber. Sourcing memungkinkan Anda untuk memasukkan variabel dalam skrip di shell saat ini , tetapi tidak pernah menjadi induk dari itu. Memang benar, Anda harus berhati-hati untuk tidak menggunakan perintah keluar atau sejenisnya, karena itu akan menutup shell Anda saat ini.

Anda dapat sumber skrip dengan menggunakan ".", Yaitu

. ./myscript.ksh



3

Mungkin jika Anda mencoba ...

#!/bin/bash

mknod fifo p

(
       echo 'value' > fifo &
)

VARIABLE=`cat fifo`
rm fifo

Ini bukan variabel ekspor, tetapi dapat memberikan komunikasi dasar dengan proses induk.


1

OKE, jangan tertawa sekarang. Solusi yang sangat cepat dan sangat kotor adalah dengan menambahkan

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

ke skrip Anda.

Pendekatan lain . Hanya exec$ SHELL bawahan dalam skrip Anda, mungkin dengan prompt berbeda (ubah $ PS1 untuk memberi tahu pengguna di mana lingkungan mereka bekerja untuk mengurangi kebingungan).

Pendekatan lain (favorit saya). Pengguna lupa sumber skrip Anda, mengapa begitu? Sourcing adalah cara standar untuk melakukannya. Mungkin cara yang baik untuk mengingatkan mereka adalah dengan menghapus baris pertama ( #!/bin/sh) dan kemudian chmod a-x. Itu masih bisa bersumber setelah itu, tetapi jelas tidak bisa dieksekusi secara keliru.

Kata-kata kasar : Pertama-tama, saya merasa Anda memiliki ide aneh sejak awal. Mungkin tidak aneh ... saya akan mengatakan agak non-Unix dalam gaya. Saya tidak pernah perlu mengekspor lingkungan ke orang tua dalam hidup saya. Saya pernah melihat situasi yang sama - login. Profil menanyakan yang mana dari tiga lingkungan yang berbeda untuk ditetapkan untuk satu akun oracle. Gagasan buruk, pada akhirnya ternyata pengguna lebih memilih untuk bermigrasi ke sudo (mereka sudo ke tiga akun oraxxx berbeda). Apa yang ingin Anda capai, jika saya boleh bertanya?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.