Làm thế nào để thay đổi PATH trong tập lệnh shell?


28

Tôi có một số dự án yêu cầu tôi thay đổi các phiên bản Java / Grails / Maven. Tôi đang cố gắng xử lý việc này với một số tập lệnh sẽ thực hiện các thay đổi. Ví dụ:

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

Khi điều này thực thi, nó thay đổi thành công PATH trong ngữ cảnh của tập lệnh, nhưng sau đó tập lệnh kết thúc và không có thay đổi nào được thực hiện.

Làm cách nào tôi có thể chạy một tập lệnh theo cách thay đổi PATH trong trình bao mà tôi hiện đang làm việc?

Tôi đang sử dụng Cygwin.

Câu trả lời:


39

Bạn phải sử dụng sourcehoặc evalhoặc sinh ra một vỏ mới.

Khi bạn chạy một kịch bản shell, shell con mới được sinh ra. Đây con shell sẽ thực thi các lệnh script. Các cha môi trường shell sẽ vẫn bị ảnh hưởng bởi bất cứ điều gì xảy ra trong con shell.

Có rất nhiều kỹ thuật khác nhau để quản lý tình huống này:

  1. Chuẩn bị tập tin sourcefile có chứa có một danh sách các lệnh để sourcetrong vỏ hiện tại:

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

    và sau đó nguồn nó

    source sourcefile

    lưu ý rằng không có nhu cầu về một sha-bang tại bắt đầu của sourcefile , nhưng nó sẽ làm việc với nó.

  2. Chuẩn bị một tập lệnh evalfile.sh in lệnh để thiết lập môi trường:

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

    và sau đó evaluate nó:

    eval `evalfile.sh`
  3. Cấu hình và chạy shell mới:

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

    lưu ý rằng khi bạn gõ exitvào vỏ này, bạn sẽ trở về với cha .

  4. Đặt một bí danh trong ~/.bashrc:

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

    và gọi nó khi cần thiết:

    prepare_environ

1
Tôi nhận thấy rằng sourcechỉ hoạt động cho bash. Đầu ra cho ksh: /bin/ksh: source: not found, cho sh: sh: 0: source: not found. Câu trả lời dưới đây nên được xem xét cho các vỏ này.
Daniel Lo

@dannylo, bạn nói đúng nhưng câu hỏi rõ ràng là bashtrung tâm.
andcoz

Có phải 'xuất khẩu' với $ PATH - có lẽ đã tồn tại?
esskov

@esskov thường thì không. Tôi chỉ nhớ một phiên bản cũ của sh trên AIX yêu cầu nó (khoảng năm 1992), nhưng, có lẽ, đó là một loại lỗi.
andcoz

19

Bạn có thể làm điều đó bằng cách sử dụng nguồn dựng sẵn:

. script_name

Một số shell cung cấp một bí danh có tên là nguồn :

source script_name

-1

đã cài đặt Chocolatey @ unix, bạn chỉ có thể chạy RefreshEnv để nhận các biến môi trường được cập nhật vào phiên hiện tại của bạn

chi tiết


1
Câu hỏi mà bạn đã liên kết (và câu trả lời của nó) là về Windows.   Câu hỏi này là về Unix & Linux, vì vậy bài đăng của bạn không trả lời câu hỏi này .
G-Man nói 'Phục hồi Monica'

đã cài đặt Chocolatey @ unix

OK, bạn cho rằng câu trả lời này hoạt động cho Unix. Liên kết chi tiết của bạn vẫn không liên quan. Vui lòng cung cấp chi tiết về cách thức hoạt động trong Unix. Liên kết đến các tài liệu có thẩm quyền sẽ tốt, nhưng đừng chỉ đăng các liên kết; đưa thông tin liên quan vào câu trả lời của bạn Xin vui lòng không trả lời trong các ý kiến; chỉnh sửa câu trả lời của bạn để làm cho nó rõ ràng và đầy đủ hơn.
G-Man nói 'Phục hồi Monica'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.