Bir kabuk betiğinde PATH nasıl değiştirilir?


28

Java / Grails / Maven'in sürümlerini değiştirmemi gerektiren birkaç projem var. Bunu, değişiklikleri yapacak bazı betikler ile ele almaya çalışıyorum. Örneğin:

#!/bin/sh

export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
export PATH=$JAVA_HOME/bin:$PATH
export GRAILS_HOME=/cygdrive/c/dev/grails-1.0.3
export PATH=$GRAILS_HOME/bin:$PATH
export MAVEN_HOME=/cygdrive/c/dev/apache-maven-2.0.11
export PATH=$MAVEN_HOME/bin:$PATH
which java
which grails
which mvn

Bu yürütüldüğünde, PATH'yi komut dosyası bağlamında başarılı bir şekilde değiştirir, ancak komut dosyası sona erer ve değişiklik yapılmaz.

Şu anda çalıştığım kabuğun PATH değerini değiştirecek şekilde bir komut dosyasını nasıl çalıştırabilirim?

Cygwin kullanıyorum.

Yanıtlar:


39

Yeni bir kabuk kullanmak sourceveya kullanmak zorundasınız eval.

Bir kabuk betiği çalıştırdığınızda, yeni bir alt kabuk yumurtlanır. Bu alt kabuk komut dosyası komutlarını yürütecektir. Baba şey olur tarafından kabuk ortamı bakir kalacak çocuk kabuk.

Bu durumu yönetmek için pek çok farklı teknik var:

  1. Geçerli kabuktaki komutların listesini içeren bir dosya kaynağı dosyası hazırlayın source:

    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH

    ve sonra kaynak

    source sourcefile

    Kaynak dosya başında bir sha-bang gerekmediğine dikkat edin , ancak onunla çalışacak.

  2. Ortamı ayarlamak için komutu basan bir evalfile.sh betiği hazırlayın :

    #!/bin/sh
    echo "export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22"
    echo "export PATH=$JAVA_HOME/bin:$PATH"

    ve sonra evalonu işleyin:

    eval `evalfile.sh`
  3. Yeni bir kabuk yapılandırın ve çalıştırın:

    #!/bin/sh
    export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22
    export PATH=$JAVA_HOME/bin:$PATH
    
    exec /bin/bash

    exitbu kabuğu yazdığınızda , babaya geri döneceğinizi unutmayın .

  4. Bir takma ad ekleyin ~/.bashrc:

    alias prepare_environ='export JAVA_HOME=/cygdrive/c/dev/Java/jdk1.5.0_22; export PATH=$JAVA_HOME/bin:$PATH;'

    ve gerektiğinde arayın:

    prepare_environ

1
Bunun sourcesadece işe yaradığını fark ettim bash. İçin çıktı ksh: /bin/ksh: source: not foundiçin sh: sh: 0: source: not found. Aşağıdaki cevap bu kabuklar için düşünülmelidir.
Danny Lo,

@ dannylo, haklısın ama soru açıkça bashmerkezli.
andcoz

Muhtemelen zaten mevcut olan $ PATH ile 'dışa aktarma' gerekli midir?
esskov

@esskov genellikle değil. AIX'teki sh'in eski bir versiyonunu hatırladım (1992 dolaylarında), ancak muhtemelen bir çeşit hataydı.
andcoz

19

Bunu kaynak yerleşikini kullanarak yapabilirsiniz :

. script_name

Bazı mermiler kaynak adında bir takma ad sağlar :

source script_name

-1

yüklenen Chocolatey @ unix, güncellenmiş ortam değişkenlerini mevcut oturumunuza almak için RefreshEnv'i çalıştırabilirsiniz.

detay


1
Siz de bağladığınız soru (ve cevapları) Windows ile ilgilidir.   Bu soru Unix ve Linux'la ilgili, bu nedenle yazınız bu soruyu yanıtlamıyor .
G-Man

yüklü Chocolatey @ unix
小 色狼

Tamam, bu cevabın Unix için işe yaradığını iddia ediyorsun. Ayrıntı bağlantınız hala önemli değil. Lütfen bunun Unix'te nasıl çalıştığına ilişkin ayrıntıları sağlayın. Yetkili dokümanlara bağlantılar iyi olurdu, ancak sadece linkler göndermeyin; ilgili bilgileri cevabınıza yerleştirin. … Lütfen yorumlara cevap vermeyin; cevabınızı daha net ve daha eksiksiz hale getirmek için düzenleyin .
G-Man,
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.