skrip bash dan fish tidak kompatibel, tetapi saya ingin memiliki file yang mendefinisikan beberapa variabel lingkungan yang akan diinisialisasi oleh bash dan fish.
Solusi yang saya usulkan adalah mendefinisikan ~/.env
file yang akan berisi daftar variabel lingkungan seperti:
PATH="$HOME/bin:$PATH"
FOO="bar"
Saya kemudian bisa hanya sumber di bash dan membuat skrip yang mengubahnya menjadi format ikan dan sumber yang ada di ikan.
Saya berpikir mungkin ada solusi yang lebih baik dari ini, jadi saya meminta cara yang lebih baik untuk berbagi variabel lingkungan antara ikan bash.
Catatan: Saya menggunakan OS X.
Berikut ini contoh .env
file yang ingin saya tangani baik ikan maupun bash menggunakan sintaks konyol-ikan (anggap ~ / bin dan ~ / bin2 adalah direktori kosong):
setenv _PATH "$PATH"
setenv PATH "$HOME/bin"
setenv PATH "$PATH:$HOME/bin2"
setenv PATH "$PATH:$_PATH"
sumber
PATH
perbaikan untuk ikan bekerja dengan jalur dengan: spasi? baris baru? hal-hal lain yang harus diwaspadai?[
adalah builtin pada bash dan fish, jadi PATH tidak perlu diatur dengan benar untuk digunakan[
. Sampel setenv harus bekerja dengan semua karakter di PATH kecuali untuk titik dua dan baris baru.tr
dengan/usr/bin/tr
saya dan menggunakan.env
file yang disediakan dalam pertanyaan saya, saya mendapatkan banyak kesalahan saat memulai ikan. Saya tidak berpikir penanganan PATH benar.Ada (sekarang?) Cara yang lebih mudah, per jawaban Zanchey di sini
Kerang Ikan: Cara mengatur beberapa variabel lingkungan dari file menggunakan ekspor
Intinya adalah:
Ikan:
echo -e "foo=3\nfoobar=4" > .env; export (cat .env); env | grep foo
Pesta:
echo -e "foo=3\nfoobar=4" > .env; export $(cat .env | xargs); env | grep foo
dengan perbedaan menjadi
$
dan penggunaanxargs
sumber
Sebagian besar sistem Unix menggunakan PAM . The
pam_env
modul membaca file yang sangat banyak seperti Anda.env
.Di Linux ,
pam_env
membaca file sistem/etc/environment
dan file pengguna~/.pam_environment
. Pada OS X (dan * BSD lainnya, yang juga menggunakan OpenPAM), tampaknyapam_env
hanya membaca file sistem, jadi Anda tidak dapat mengatur variabel per pengguna dengan cara ini, hanya untuk semua pengguna.sumber
Memperluas pada jawaban @ ridiculous_fish, dengan fungsi berikut untuk bash, ia juga berfungsi untuk array yang berisi spasi, seperti
$PATH
jika Anda memiliki spasi di jalur Anda. Namunsetenv
sudah didefinisikan sebagai fungsi di perpustakaan standar ikan saat ini jadi saya mengubah nama di sini menjadishenv
Sekarang di
.env
file Anda, Anda dapat menentukan komponen array sebagai argumen terpisah untuksetenv
perintah:Untuk implementasi sederhana dari fish @ ridiculous_fish akan dilakukan:
sumber
Cukup buat fungsi di $ HOME / .config / fish / functions / env.fish dengan konten:
membagikan semua vars yang dibuat dalam bash di folder /etc/profile.d
misalnya: /etc/profile.d/golang.sh
cukup login dengan ikan atau bash, lakukan
echo $GOPATH $GOROOT $GOBIN $PATH
dan lihat keajaibannya :)sumber