Bir kabuk betiğinde çevre değişkenlerini “dışa aktarılmış” nasıl yapabilirim?


54

Birden fazla Amazon EC2 hesabım var ve $EC2_HOMEbir komut dosyası kullanmak gibi değişkenleri hızlı bir şekilde değiştirebilmek istiyorum .

Böyle bir kabuk komut dosyası var:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

Komut dosyasını çalıştırdığımda bunun EC2_HOMEayarlandığını biliyorum , ancak exportkomut dosyasının tamamlanmasından sonra kullanmanın değişken yapışmasını engelleyeceğini düşündüm . Çalışmaz, echo $EC_HOMEhiçbir şey göstermediğinden yok.

Bunun çok basit Linux betik bilgisi olması gerektiğini biliyorum ama bilmiyorum. İlgili soruları şanssız aramaya çalıştım - özür dilerim, eğer bu bir kopya ise.

Yanıtlar:


60

Senaryonuzu kaynakla yazmalısınız

. ./script

veya

source ./script

19
Bunun nedeni, betiğinizin, mevcut kabuğun alt öğesi olarak yeni bir kabuk işlemi başlatmasıdır. Eğer çocuk sürecinde yaptığınız tüm çevre değişiklikleri olamaz ebeveyni etkiler. Kullandığınızda .veya sourceyeni bir alt süreç oluşturmazsanız, komutları geçerli kabukta çalıştırıyorsunuzdur.
glenn jackman

1
@glennjackman Benzer bir sorunum var ve çözümünüzü denedim, ancak yaptığımda .veya beni kabuktan kapatıyor source. Bu neden oluyor ?
Patryk,

7
@Patryk: belki betiğinizin bir exitdeyimi vardır, bu yüzden kaynaklanmak uygun değildir.
enzotib

source ./scriptTamamen iyi çalışıyor iken , sudo source ./script.shdiyor sudo: source: command not found. Sudo kullanarak bunu nasıl yapabilirim?
71GA

1
@ 71GA: Derleme tercihlerine sudobağlı olarak ve içindeki konfigürasyon ayarlarına bağlı olarak /etc/sudoerskomutları çalıştırırken ortamınızı koruyabilirsiniz veya olamaz sudo. Ben size komut kaynak ve sonra çalıştırmayı deneyin önermek sudoile -Eçevreyi korumak için seçenek. İşe yaramazsa, yapabileceğin çok az şey olduğunu varsayalım.
enzotib

35

Bir komut dosyasını çalıştırdığınızda, komut dosyası biter bitmez tekrar kaybolan kendi kabuğunu ve kendi ortamını alır. Ortam değişkenlerini etrafta tutmak için betiği mevcut kabuğunuza ekleyin:

$ source ./a.sh

veya eşdeğerde (ancak biraz daha taşınabilir) POSIX dot komutunu kullanın :

$ . ./a.sh

Ardından tanımlar mevcut kabuğunuzun ortamına girecek ve ondan başlattığınız herhangi bir program tarafından miras alınacaktır.

Bir betiği çalıştırmaya daha yakın olmak için . a.sh, PATHortam değişkenindeki dizinleri arayarak a.sh dosyasını bulun .


Orada bu nasıl davrandığını içinde bazı incelikleri vardır ve ister .ve source(hiç ya da mevcut) aynıdır. . ./a.shKesinlikle her POSIX uyumlu kabuğunda aynı davranacaktır, ancak sourceve .ve . a.shve . ./a.shdeğişebilir. Bash için sourceve. her durumda aynıdır ; için zsh sourceher zaman ilk geçerli dizin denetler ; ksh esasen benzerdir.

Komut dosyası adı bir yol olarak verilirse (a'yı içeren /), bu yol her durumda doğrudan kullanılır. Yapılması en güvenilir şey . ./scriptya da . /path/to/script.


1

Sadece kayıt için.

Env'yi sisteme ihraç eden internetten komut dosyası çalıştırmak istiyorsanız

aşağıdaki formatı kullanabilirsiniz

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

Örneğin:

source <(curl -s -L https://example.com/install.sh)

Bu senaryoya güveniyorsanız tehlikeli ama kullanışlı görünüyor!
Mark Stewart
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.