Bagaimana cara mengubah PATH dalam skrip shell?

28

Saya memiliki beberapa proyek yang mengharuskan saya untuk mengubah versi Java / Grails / Maven. Saya mencoba menangani ini dengan beberapa skrip yang akan membuat perubahan. Sebagai contoh:

#!/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

Ketika ini dijalankan, itu berhasil mengubah PATH dalam konteks skrip, tetapi kemudian skrip berakhir, dan tidak ada perubahan yang dilakukan.

Bagaimana saya bisa menjalankan skrip dengan cara mengubah PATH untuk shell di mana saya saat ini bekerja?

Saya menggunakan Cygwin.

Eric Wilson
sumber

Jawaban:

39

Anda harus menggunakan sourceatau evalatau menelurkan shell baru.

Saat Anda menjalankan skrip shell, shell anak baru akan muncul. Shell anak ini akan menjalankan perintah skrip. Lingkungan kulit ayah akan tetap tidak tersentuh oleh apa pun yang terjadi di kulit anak .

Ada banyak teknik berbeda untuk mengelola situasi ini:

  1. Persiapkan file sourcefile yang berisi daftar perintah sourcedi dalam shell saat ini:

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

    dan kemudian sumber itu

    source sourcefile

    perhatikan bahwa tidak perlu melakukan sha-bang di awal sourcefile , tetapi itu akan bekerja dengannya.

  2. Siapkan skrip evalfile.sh yang mencetak perintah untuk mengatur lingkungan:

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

    dan kemudian evalgunakan:

    eval `evalfile.sh`
  3. Konfigurasikan dan jalankan shell baru:

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

    perhatikan bahwa ketika Anda mengetikkan exitshell ini, Anda akan kembali ke ayah .

  4. Masukkan alias di ~/.bashrc:

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

    dan menyebutnya saat dibutuhkan:

    prepare_environ
andcoz
sumber
1
Saya perhatikan itu sourcehanya berfungsi untuk bash. Output untuk ksh: /bin/ksh: source: not found, untuk sh: sh: 0: source: not found. Jawaban di bawah ini harus dipertimbangkan untuk cangkang ini.
Danny Lo
@dannylo, Anda benar tetapi pertanyaannya jelas bashsentris.
andcoz
Apakah 'ekspor' diperlukan dengan $ PATH - yang mungkin sudah ada?
esskov
@esskov biasanya tidak. Saya ingat hanya versi lama sh pada AIX yang membutuhkannya (sekitar 1992) tetapi, mungkin, itu semacam bug.
andcoz
19

Anda bisa melakukannya dengan menggunakan sumber bawaan:

. script_name

Beberapa cangkang menyediakan sumber bernama alias :

source script_name
Dimitre Radoulov
sumber
-1

diinstal Chocolatey @ unix, Anda bisa menjalankan RefreshEnv untuk mendapatkan variabel lingkungan yang diperbarui ke sesi Anda saat ini

detail

小 色狼
sumber
1
Pertanyaan yang Anda tautkan juga (dan jawabannya) adalah tentang Windows.   Ini pertanyaan adalah tentang Unix & Linux, sehingga posting Anda tidak menjawab ini pertanyaan.
G-Man Mengatakan 'Reinstate Monica'
menginstal Chocolatey @ unix
小 色狼
OK, Anda mengklaim bahwa jawaban ini berfungsi untuk Unix. Tautan detail Anda masih tidak relevan. Harap berikan detail tentang bagaimana ini bekerja di Unix. Tautan ke dokumen otoritatif akan baik, tetapi jangan memposting tautan saja; masukkan informasi yang relevan ke dalam jawaban Anda. ... Tolong jangan menanggapi dalam komentar; edit jawaban Anda untuk membuatnya lebih jelas dan lebih lengkap.
G-Man Mengatakan 'Reinstate Monica'