Anahtar / değer çiftleri dosyasından ortam değişkenlerini ayarlama


511

TL; DR: Bir metin dosyasından bir dizi anahtar / değer çiftini kabuk ortamına nasıl aktarabilirim?


Kayıt için, aşağıda örneklerle birlikte sorunun orijinal sürümü yer almaktadır.

Belli bir klasörde 3 değişkenli dosyaları ayrıştıran bash'ta bir betik yazıyorum, bunlardan biri:

MINIENTREGA_FECHALIMITE="2011-03-31"
MINIENTREGA_FICHEROS="informe.txt programa.c"
MINIENTREGA_DESTINO="./destino/entrega-prac1"

Bu dosya ./conf/prac1 dizininde saklanır

Benim komut dosyası minientrega.sh sonra bu kodu kullanarak dosyayı ayrıştırır:

cat ./conf/$1 | while read line; do
    export $line
done

Ancak minientrega.sh prac1komut satırında yürüttüğümde ortam değişkenlerini ayarlamıyor

Ayrıca kullanmayı denedim source ./conf/$1ama aynı sorun hala geçerli

Belki bunu yapmanın başka bir yolu var, sadece benim komut dosyası argümanı olarak geçirdiğim dosyanın ortam değişkenlerini kullanmanız gerekir.




Bu harika bir soru ama belirli değişken isimleri ("MINIENTREGA_FECHALIMITE"? Bu ne anlama geliyor?) Ve sayılar (3) ile çok özel bir şekilde ifade edilmiştir. Genel soru şudur: "Bir metin dosyasından bir dizi anahtar / değer çiftini kabuk ortamına nasıl aktarabilirim".
Dan Dascalescu

Ayrıca, bu zaten unix.SE üzerinde cevaplanmıştır ve tartışmasız daha fazla konu üzerinde.
Dan Dascalescu

Yanıtlar:


208

Yaklaşımınızdaki sorun export, whiledöngü içinde bir alt kabukta gerçekleşiyor ve bu değişken geçerli kabukta (while döngüsünün üst kabuğu) kullanılamayacak.

exportDosyanın kendisine komut ekle :

export MINIENTREGA_FECHALIMITE="2011-03-31"
export MINIENTREGA_FICHEROS="informe.txt programa.c"
export MINIENTREGA_DESTINO="./destino/entrega-prac1"

Sonra geçerli kabuk dosyada kaynak kullanarak gerekir:

. ./conf/prac1

VEYA

source ./conf/prac1

4
Dosya line-by-line okuma ve her satırı geçen rağmen exportideal değildir, sorun da basitçe döngü giriş yönlendirme kullanarak düzeltilebilir: while read line; do ... ; done < ./conf/$1.
chepner

4
Ve bu dosya, kullanım gelen değilse< <(commands that generate output)
o11c

5
Daha temiz bir çözümünüz var, tercihim varset -o allexport
heralight

2
Sistemler arasında bu .env dosyası kullanılıyorsa, ekleme işlemi exportJava, SystemD veya diğer araçlar için onu bozar
FilBot3

1
awk '{print "export " $0}' envfileihracatın her satırın başına başlamasını sağlamak için kolaylık komutu
Shardj

887

Bu yardımcı olabilir:

export $(cat .env | xargs) && rails c

Bunu kullanmamın nedeni, .envraylar konsolumdaki şeyleri test etmek istiyorsam .

gabrielf değişkenleri yerel tutmak için iyi bir yol buldu. Bu, projeden projeye giderken potansiyel problemi çözer.

env $(cat .env | xargs) rails

Bunu ile test ettim bash 3.2.51(1)-release


Güncelleme:

İle başlayan satırları yok saymak için şunu #kullanın ( Pete'nin yorumu sayesinde ):

export $(grep -v '^#' .env | xargs)

Ve unsetdosyada tanımlanan tüm değişkenleri istiyorsanız , bunu kullanın:

unset $(grep -v '^#' .env | sed -E 's/(.*)=.*/\1/' | xargs)

Güncelleme:

Değerleri boşluklarla da işlemek için şunu kullanın:

export $(grep -v '^#' .env | xargs -d '\n')

GNU sistemlerinde - veya:

export $(grep -v '^#' .env | xargs -0)

BSD sistemlerinde.


6
Teşekkürler, bunun dosyaya bir şey eklemeyi gerektirmediğini seviyorum - Foreman (Procfile) .env formatı ile uyumluluk sağlar.
natevw

29
Çözüm buldum: env $ (cat .env | xargs) raylar
gabrielf

4
Env değerlerinden herhangi birinin boşlukları varsa, bu işe yaramaz gibi görünse de, boşluklarla değerleri belirtmenin en iyi / istenen yolunun ne olduğundan emin değilim. github.com/ddollar/foreman/issues/56 bunun gibi çalışması gerektiğini söylüyor, export $(cat .env)ancak boşluklarla nasıl başa çıkacağımı bilmiyorum.
Dan Benamy

6
@BenjaminWheeler GNU linux -dsınırlayıcıyı ayarlamak için var, bu yüzden deniyorum env $(cat .env | xargs -d '\n') rails, ama yine .envde boşluk varsa bulunamadı bir dosya ile hatalar . Bunun neden işe yaramadığı hakkında bir fikrin var mı?
Bailey Parker

19
İşte daha kısa bir varyasyoneval $(cat .env) rails
manalang

412

-o allexportaşağıdaki tüm değişken tanımlarının dışa aktarılmasını sağlar. +o allexportbu özelliği devre dışı bırakır.

set -o allexport
source conf-file
set +o allexport

9
Tıkır tıkır çalışıyor! .envDosyada yorum olsa bile . Teşekkürler!
Slava Fomin II

9
Ve bir satırdaset -o allexport; source conf-file; set +o allexport
HarlemSquirrel

1
Bu, Jenkins EnvInject eklentisi çalışmadığında özellikler dosyasında okumak için harika bir yoldur. Teşekkürler!
Teresa Peters

21
@CMCDragonkai, POSIX için olurdu set -a; . conf-file; set +a.
Charles Duffy

3
Bu yöntem, ortam değişkenlerinin içinde boşluklar varsa çalışır. Diğerlerinin çoğu değil. Eval () yöntemi yaparken, eval
CommandZ

138
set -a
. ./env.txt
set +a

Şöyle env.txtise:

VAR1=1
VAR2=2
VAR3=3
...

Açıklamalar -a, allexport'a eşdeğerdir . Başka bir deyişle, kabuktaki her değişken ataması ortama aktarılır (birden çok alt işlem tarafından kullanılmak üzere). Daha fazla bilgi Set yerleşik belgelerinde bulunabilir :

-a     Oluşturulan veya değiştirilen her değişken veya işleve dışa aktarma özelliği verilir ve sonraki komutların ortamına dışa aktarılmak üzere işaretlenir.

'-' yerine '+' kullanılması bu seçeneklerin kapatılmasına neden olur. Seçenekler, kabuğun çağrılması üzerine de kullanılabilir. Geçerli seçenekler kümesi $ - içinde bulunabilir.


-A ve + a'yı açıklayabilir misiniz?
Otto

11
@Otto -aeşdeğerdir allexport. Başka bir deyişle, kabuktaki her değişken ataması exportçevreye düzenlenir (birden çok alt işlem tarafından kullanılacak). Ayrıca bu makaleye bakın gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
Dan Kowalczyk

33

allexportSeçenek kendisi için burada diğer cevaplar, bir çift belirtilen set -akısa yoldur. .Env'nin kaynağı gerçekten satırlar üzerinde döngü ve dışa aktarmadan daha iyidir çünkü komutlar tarafından oluşturulan yorumlara, boş satırlara ve hatta ortam değişkenlerine izin verir. Benim .bashrc aşağıdakileri içerir:

# .env loading in the shell
dotenv () {
  set -a
  [ -f .env ] && . .env
  set +a
}

# Run dotenv on login
dotenv

# Run dotenv on every new directory
cd () {
  builtin cd $@
  dotenv
}

3
Bu hoş görünüyor, ancak dizinden ayrılırken ortam değişkenlerini kaldırıyor musunuz?
Bastian Venthur

1
Değişkenleri tanımlamıyorum ve hiçbir zaman sorun olmadı. Uygulamalarım farklı değişken adları kullanma eğilimindedir ve çakışma varsa, bunları .env ile boş olarak ayarlayacağım VAR=.
gsf

26
eval $(cat .env | sed 's/^/export /')

1
Kullanımı eval $(cat .env | sed 's/^[^$]/export /')daha iyi okunabilirlik için boş satırlara sahip olmanızı sağlar.
Mario Uher

2
cat .env | sed 's/^[^$]/export /'İlk karakteri çıkardığını görüyorum . Yani bir dosya A=foo\nB=bar\nalıyorum export =foo\nexport =bar\n. Bu boş satırlar atladığı için daha iyi çalışır: cat .env | sed '/^$/! s/^/export /'.
Owen

(Her catiki durumda da ihtiyacınız olmayan UNIX kodlu golfçüler uğruna şunu da not ediyorum: aynı şekilde eval $(sed 's/^/export /' .env)çalışıyor.)
Owen S.

21

En etkili yolu buldum:

export $(xargs < .env)

açıklama

Böyle bir .envdosyamız olduğunda :

key=val
foo=bar

koş xargs < .envalacakkey=val foo=bar

bu yüzden bir alacağız export key=val foo=barve tam olarak ihtiyacımız olan şey!

sınırlama

  1. Değerlerin içinde boşluk olduğu durumları işlemez. Env gibi komutlar bu biçimi üretir. - @Shardj

3
Değerlerin içinde boşluk olduğu durumları işlemez. envBu formatı üreten komutlar .
Shardj

19

İşte sedeval çalıştırmayan veya yakut gerektirmeyen başka bir çözüm:

source <(sed -E -n 's/[^#]+/export &/ p' ~/.env)

Bu, bir yorumla başlayan satırlara yorumları koruyarak dışa aktarma ekler.

.env içeriği

A=1
#B=2

örnek çalışma

$ sed -E -n 's/[^#]+/export &/ p' ~/.env
export A=1
#export B=2

Bu özellikle bir systemd birim dosyasınaEnvironmentFile yüklemek için böyle bir dosya oluştururken yararlı buldum .


OSX'te birden çok satırı desteklemiyor
Abdennour TOUMI

17

Ben hem basit hem de kullanıcı4040650 cevabını iptal ettim ve değişkenleri açıklayan yorumlar eklenebilir gibi benim için son derece arzu, dosyada (yani # ile başlayan satırlar) izin verir. Sadece orijinal soru bağlamında yeniden yazma.

Komut dosyası belirtildiği gibi minientrega.sh prac1çağrılırsa, minientrega.sh dosyasında şunlar olabilir:

set -a # export all variables created next
source $1
set +a # stop exporting

# test that it works
echo "Ficheros: $MINIENTREGA_FICHEROS"

Set belgelerinden aşağıdakiler alınmıştır :

Bu yapı o kadar karmaşıktır ki kendi bölümünü hak eder. set, kabuk seçeneklerinin değerlerini değiştirmenize ve konum parametrelerini ayarlamanıza veya kabuk değişkenlerinin adlarını ve değerlerini görüntülemenizi sağlar.

set [--abefhkmnptuvxBCEHPT] [-o seçenek-adı] [argüman…] set [+ abefhkmnptuvxBCEHPT] [+ o seçenek-adı] [argüman…]

Herhangi bir seçenek veya bağımsız değişken sağlanmazsa, set geçerli kabuk değişkenlerinin ve işlevlerinin adlarını ve değerlerini geçerli yerel ayara göre sıralanmış olarak, geçerli olarak ayarlanan değişkenleri ayarlamak veya sıfırlamak için giriş olarak yeniden kullanılabilecek bir biçimde görüntüler. Salt okunur değişkenler sıfırlanamaz. POSIX modunda, yalnızca kabuk değişkenleri listelenir.

Seçenekler sağlandığında, kabuk niteliklerini ayarlar veya ayarlar. Seçenekler belirtilirse şu anlamlara gelir:

-a Oluşturulan veya değiştirilen her değişken veya işleve dışa aktarma özelliği verilir ve sonraki komutların ortamına dışa aktarılmak üzere işaretlenir.

Ve bu da:

'-' yerine '+' kullanılması bu seçeneklerin kapatılmasına neden olur. Seçenekler, kabuğun çağrılması üzerine de kullanılabilir. Geçerli seçenekler kümesi $ - içinde bulunabilir.


14

Silas Paul'ün cevabını iyileştirmek

değişkenleri bir alt kabukta dışa aktarmak onları komuta yerel yapar.

(export $(cat .env | xargs) && rails c)


Daha sonra (set -a; source dev.env; set +a; rails c), kaynak sağlama avantajlarına sahip olmak için bunu kullanabilirsiniz (örn. Komut dosyası çalıştırabilir).
wacha

12

SAVE=$(set +o | grep allexport) && set -o allexport && . .env; eval "$SAVE"

Bu, ne olursa olsun orijinal seçeneklerinizi kaydeder / geri yükler.

Kullanım set -o allexport, yorumları normal ifade olmadan düzgün bir şekilde atlama avantajına sahiptir.

set +otek başına mevcut tüm seçeneklerinizi bash'ın daha sonra çalıştırabileceği bir biçimde çıkarır. Ayrıca kullanışlı: set -otek başına, mevcut tüm seçeneklerinizi insan dostu biçimde çıkarır.


2
Sadece içinde ayarlanmış değişkenleri ayarlamanız gerekiyorsa, exec env -i basharamadan önce muhtemelen mevcut ortamı temizlerdim . eval.env
b4hand

11

Bulduğum en kısa yol:

Sizin .envdosyası:

VARIABLE_NAME="A_VALUE"

O zaman sadece

. ./.env && echo ${VARIABLE_NAME}

Bonus: Kısa bir astar olduğundan, package.jsondosyada çok yararlıdır

  "scripts": {
    "echo:variable": ". ./.env && echo ${VARIABLE_NAME}"
  }

Çok değişkeniniz varsa nasıl olur?
Madeo

@Madeo istediğiniz gibi, istediğiniz kadar satır ekleyebilirsinizVARIABLE_NAME="A_VALUE"
Flavien Volken

9

Daha basit:

  1. dosyanın içeriğini al
  2. boş satırları kaldırın (bazı şeyleri ayırmanız durumunda)
  3. yorumları kaldırın (sadece biraz eklediyseniz ...)
  4. exporttüm satırlara ekle
  5. eval hepsi

eval $(cat .env | sed -e /^$/d -e /^#/d -e 's/^/export /')

Başka bir seçenek (çalıştırmak zorunda değilsiniz eval(@Jaydeep sayesinde)):

export $(cat .env | sed -e /^$/d -e /^#/d | xargs)

Son olarak, hayatınızı GERÇEKTEN kolaylaştırmak istiyorsanız, bunu aşağıdakilere ekleyin ~/.bash_profile:

function source_envfile() { export $(cat $1 | sed -e /^$/d -e /^#/d | xargs); }

(BAŞLANGIÇ AYARLARINIZI SORDUĞUNUZDAN emin olun !!! source ~/.bash_profileveya .. sadece yeni bir sekme / pencere yapın ve problem çözüldü) şöyle diyorsunuz:source_envfile .env


2
Bir boru hattı için gitlab gizli değişkenden .env metni okumak zorunda: Bu komut benim için çalıştı çözümünüz göre: source <( echo $(sed -E -n 's/[^#]+/ &/ p' <(echo "${2}" | tr -d '\r')) );. Bir şekilde gitlab gizli değişkeni bir Windows taşıma dönüşü ile kaydeder, bu yüzden bunu kesmek zorunda kaldım tr -d '\r'.
metanerd

6

Değişkenleri ayarlamak için orijinal komut dosyanızı kullanabilirsiniz, ancak bunu şu şekilde çağırmanız gerekir (tek başına nokta ile):

. ./minientrega.sh

Ayrıca cat | while readyaklaşımla ilgili bir sorun olabilir . Bu yaklaşımı kullanmanızı tavsiye ederim while read line; do .... done < $FILE.

İşte çalışan bir örnek:

> cat test.conf
VARIABLE_TMP1=some_value

> cat run_test.sh
#/bin/bash
while read line; do export "$line";
done < test.conf
echo "done"

> . ./run_test.sh
done

> echo $VARIABLE_TMP1
some_value

Diğer yanıtların çoğundan farklı olarak, bu çözüm test.confbir komut dosyası olarak değerlendirilmez. Bu daha iyi olur. Gerçekten gerekmedikçe komut dosyasına izin vermemek daha güvenlidir, özellikle de birisi bunun olup bittiğini (veya unutduğunu) fark etmezse.
meustrus

5

Diğer yanıtları temel alarak, aşağıdaki gibi boşluklara sahip değerler de dahil olmak üzere dosyadaki yalnızca bir satır alt kümesini dışa aktarmanın bir yolu PREFIX_ONE="a word":

set -a
. <(grep '^[ ]*PREFIX_' conf-file)
set +a

5

İşte benim değişkenim:

  with_env() {
    (set -a && . ./.env && "$@")
  }

önceki çözümlerle karşılaştırıldığında:

  • kapsam dışındaki değişkenleri sızdırmaz (gelen değerler .envçağırana maruz kalmaz)
  • tıkırtı setseçenekleri yok
  • yürütülen komutun çıkış kodunu döndürür
  • posix uyumlu kullanır set -a
  • kullandığı .yerine sourceönlemek bashism için
  • .envyükleme başarısız olursa komut çağrılmaz
with_env rails console

Satır içi de çalıştırabilirsiniz (değişkenler mevcut terminal oturumunuza maruz kalır): set -a && . ./.env && "$@" && echo "your comand here"
Giovanne Afonso

4

.envMac'te docker-compose ve dosyalarla çalışıyorum ve .envbash kabuğuma (test için) içe aktarmak istedim ve "en iyi" yanıtı aşağıdaki değişken üzerinde açmaya başladı:

.env

NODE_ARGS=--expose-gc --max_old_space_size=2048

Çözüm

Bu yüzden evalenv var defs kullanarak tek tırnak içinde kullanarak ve sarma sona erdi .

eval $(grep -v -e '^#' .env | xargs -I {} echo export \'{}\')

Bash Sürümü

$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.


2

Daha önce önerilen çözümlerle ilgili sorunlarım var:

  • @ anubhava'nın çözümü, bash dostu yapılandırma dosyalarını yazmayı çok can sıkıcı hale getirir ve ayrıca - yapılandırmanızı her zaman dışa aktarmak istemeyebilirsiniz.
  • @Silas Paul çözümü, belirtilen değerlerde iyi çalışan boşluklara veya diğer karakterlere sahip değişkenler olduğunda kırılır $().

İşte hala oldukça korkunç IMO olan ve Silas tarafından ele alınan "sadece bir çocuğa ihracat" sorununu çözmeyen çözümüm (muhtemelen kapsamı sınırlamak için bir alt kabukta çalıştırabilirsiniz):

source .conf-file
export $(cut -d= -f1 < .conf-file)

2

Gereksinimlerim:

  • öneksiz basit .env dosyası export(dotenv ile uyumluluk için)
  • tırnak içinde değerleri destekleme: TEXT = "alpha bravo charlie"
  • # ve boş satırlarla ön ekli yorumları destekleme
  • mac / BSD ve linux / GNU için evrensel

Yukarıdaki yanıtlardan derlenen tam çalışma sürümü:

  set -o allexport
  eval $(grep -v '^#' .env | sed 's/^/export /')
  set +o allexport

1
zaten "ihracat" ile başa "-o allexport" ne anlamı var?
il - ya

2

İlk olarak, aşağıdaki gibi ortamların tüm anahtar / değer çiftlerine sahip olacak ve benim durumumda istediğiniz gibi adlandırılmış bir ortam dosyası oluşturun env_var.env

MINIENTREGA_FECHALIMITE="2011-03-31"
MINIENTREGA_FICHEROS="informe.txt programa.c"
MINIENTREGA_DESTINO="./destino/entrega-prac1"

Ardından, aşağıdaki gibi python ortamı için tüm ortam değişkenlerini dışa aktaracak ve böyle adlandırılacak bir komut dosyası oluşturun export_env.sh

#!/usr/bin/env bash

ENV_FILE="$1"
CMD=${@:2}

set -o allexport
source $ENV_FILE
set +o allexport

$CMD

Bu komut dosyası ilk bağımsız değişkeni ortam dosyası olarak alır, ardından bu dosyadaki tüm ortam değişkenini dışa aktarır ve bundan sonra komutu çalıştırır.

KULLANIM:

./export_env.sh env_var.env python app.py

1

Docker'ları --env-filebir kabukta yeniden kullanmaya çalışırken bu iş parçacığına rastladım . Biçimleri bash uyumlu değil, ancak basit: name=valueteklif yok, ikame yok. Ayrıca boş satırları ve# yorumları .

Oldukça posix uyumlu alamadım, ama burada bash benzeri kabuklarda çalışması gereken (OSX 10.12.5'te zsh ve Ubuntu 14.04'te bash'da test edilen):

while read -r l; do export "$(sed 's/=.*$//' <<<$l)"="$(sed -E 's/^[^=]+=//' <<<$l)"; done < <(grep -E -v '^\s*(#|$)' your-env-file)

Bu olmaz Yukarıda bağlantılı dokümanlardan örnekte üç davalarını:

  • bash: export: `123qwe=bar': not a valid identifier
  • bash: export: `org.spring.config=something': not a valid identifier
  • ve düz geçiş sözdizimini (çıplak FOO) işlemez

1

Değerdeki beyaz boşluklar

Burada birçok harika cevap var, ama hepsinin beyaz boşluk için değer eksik olduğunu gördüm:

DATABASE_CLIENT_HOST=host db-name db-user 0.0.0.0/0 md5

Boş satırları ve yorumları destekleyerek bu tür değerlerle çalışan 2 çözüm buldum.

Biri sed ve @ javier-buzzi cevabını temel alır :

source <(sed -e /^$/d -e /^#/d -e 's/.*/declare -x "&"/g' .env)

Ve @ john1024 cevap dayalı bir döngüde okuma satırı olan bir

while read -r line; do declare -x "$line"; done < <(egrep -v "(^#|^\s|^$)" .env)

Buradaki anahtar, declare -xsatırı çift tırnak içine almak ve koymaktır. Nedenini bilmiyorum ama döngü kodunu birden çok satıra yeniden biçimlendirdiğinizde işe yaramaz - bash programcısı değilim, bunları bir araya getirdim, hala benim için sihir :)


1
sedÇalışması için çözümü değiştirmek zorunda kaldım . Ama önce bazı açıklamalar: -ekısaca --expression, hangi sedişlemlerin yapılacağını söyler . -e /^$/dboş satırları çıktıdan siler (dosyadan değil). -e /^#/dbash yorumlarını (# ile başlayan satırlar) çıktıdan siler. 's/.*/declare -x "&"/g'kalan satırları değiştirir (değiştirir) declare -x "ENV_VAR="VALUE"". Bunu kaynakladığınızda, en azından benim için, işe yaramadı. Bunun yerine, source <(sed -e /^$/d -e /^#/d -e 's/.*/declare -x &/g' .env)ekstra "sargıyı çıkarmak için kullanmak zorunda kaldım .
jcasner

Ben kullanmıyorum ENV_VAR="lorem ipsum", ben ENV_VAR=lorem ipsum.env dosyasında tırnak işaretleri olmadan. Şimdi neden olduğundan emin değilim, ama bu dosyayı ayrıştıran diğer araçlarda muhtemelen sorunluydu. Yerine Ve lorem ipsumben sona erdi "lorem ipsum"tırnak - değeri. Açıklamalar için
teşekkürler

1
Benim seçimim olsaydı, ben de kullanmazdım ENV_VAR="lorem ipsum". Kullanım durumumda, barındırma sağlayıcım bu dosyayı ayarladığım bazı yapılandırma seçeneklerine göre oluşturur ve çift tırnak işaretleri ekler. Bu yüzden, etrafta çalışmak zorunda kaldım. Burada yardımlarınız için teşekkürler - doğru sedseçenekleri kendim çözmeye çalışırken çok zaman kazandım!
jcasner

1

böyle bir şey dene

for line in `cat your_env_file`; do if [[ $line != \#* ]];then export $line; fi;done

1
t=$(mktemp) && export -p > "$t" && set -a && . ./.env && set +a && . "$t" && rm "$t" && unset t

Nasıl çalışır

  1. Geçici dosya oluşturun.
  2. Geçerli tüm ortam değişkenleri değerlerini geçici dosyaya yazın.
  3. Kaynaklar komut dosyasında bildirilen tüm değişkenlerin ortama aktarılmasını etkinleştir.
  4. .envDosyayı oku . Tüm değişkenler mevcut ortama aktarılacaktır.
  5. Kaynaklar komut dosyasında bildirilen tüm değişkenlerin ortama aktarılmasını devre dışı bırakın.
  6. Geçici dosyanın içeriğini okuyun. Her satır declare -x VAR="val", değişkenlerin her birini ortama aktaracaktır.
  7. Geçici dosyayı kaldırın.
  8. Değişken tutma geçici dosya adını kaldırın.

Özellikleri

  • Ortamda önceden ayarlanmış değişkenlerin değerlerini korur
  • .env yorum yapabilir
  • .env boş çizgiler olabilir
  • .envdiğer yanıtlardaki gibi özel üstbilgi veya altbilgi gerektirmez ( set -ave set +a)
  • .envexporther değer için sahip olmayı gerektirmez
  • bir liner


0

.Env dosyam şöyle görünüyor:

DATABASE_URI="postgres://sa:***@localhost:5432/my_db"
VARIABLE_1="SOME_VALUE"
VALIABLE_2="123456788"

@Henke'nin yollarını kullanarak, dışa aktarılan değer tırnak işaretlerini içerir"

"postgres://sa:***@localhost:5432/my_db"
"SOME_VALUE"
"123456788"

Ancak dışa aktarılan değerin yalnızca içermesini istiyorum:

postgres://sa:***@localhost:5432/my_db
SOME_VALUE
123456788

Düzeltmek için, tırnak işaretlerini silme komutunu düzenlerim:

export $(grep -v '^#' dev.env | tr --delete '"' | xargs -d '\n')

0

Bu RHS üzerindeki boşluklarla başa çıkıyor ve bash modül tanımları gibi 'garip' değişkenleri atlıyor (içlerinde '()' ile):

echo "# source this to set env vars" > $bld_dir/.env
env | while read line; do
    lhs="${line%%=*}"
    rhs="${line#*=}"
    if [[ "$lhs" =~ ^[0-9A-Za-z_]+$ ]]; then
        echo "export $lhs=\"$rhs\"" >> $bld_dir/.env
    fi
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.