จะเปลี่ยน PATH ภายในเชลล์สคริปต์ได้อย่างไร?


28

ฉันมีหลายโครงการที่ต้องการให้ฉันเปลี่ยนรุ่น Java / Grails / Maven ฉันพยายามจัดการกับสคริปต์บางอย่างที่จะทำให้การเปลี่ยนแปลง ตัวอย่างเช่น:

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

เมื่อสิ่งนี้ดำเนินการมันจะเปลี่ยน PATH ภายในบริบทของสคริปต์ แต่จากนั้นสคริปต์จะสิ้นสุดและไม่มีการเปลี่ยนแปลงใด ๆ

ฉันจะรันสคริปต์เพื่อเปลี่ยน PATH ในเชลล์ที่ฉันใช้งานอยู่ได้อย่างไร

ฉันใช้ Cygwin

คำตอบ:


39

คุณต้องใช้sourceหรือevalหรือจะวางไข่เปลือกใหม่

เมื่อคุณเรียกใช้สคริปต์เปลือกใหม่เด็กเปลือกกระบอกไม้ไผ่ เปลือกลูกนี้จะดำเนินการคำสั่งสคริปต์ พ่อของสภาพแวดล้อมที่เปลือกจะยังคงมิได้ถูกแตะต้องโดยสิ่งที่เกิดขึ้นในเด็กเปลือก

มีเทคนิคต่าง ๆ มากมายในการจัดการสถานการณ์นี้:

  1. จัดเตรียมไฟล์sourcefile ที่มีรายการคำสั่งไว้sourceในเชลล์ปัจจุบัน:

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

    แล้วก็แหล่งที่มา

    source sourcefile

    โปรดทราบว่าไม่จำเป็นต้องมี sha-bang ที่จุดเริ่มต้นของsourcefileแต่มันจะทำงานกับมัน

  2. เตรียมสคริปต์evalfile.shที่พิมพ์คำสั่งเพื่อตั้งค่าสภาพแวดล้อม:

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

    แล้วevalก็กินมัน:

    eval `evalfile.sh`
  3. กำหนดค่าและเรียกใช้เชลล์ใหม่:

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

    โปรดทราบว่าเมื่อคุณพิมพ์exitในเปลือกนี้คุณจะกลับไปหาพ่อคนหนึ่ง

  4. ใส่นามแฝงใน~/.bashrc:

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

    และเรียกมันเมื่อจำเป็น:

    prepare_environ

1
ผมสังเกตเห็นว่าทำงานเฉพาะสำหรับsource bashเอาต์พุตสำหรับksh: /bin/ksh: source: not found, สำหรับsh: sh: 0: source: not found. คำตอบด้านล่างควรได้รับการพิจารณาสำหรับหอยเหล่านี้
Danny Lo

@ Dannylo คุณพูดถูก แต่คำถามนั้นชัดเจนว่าbashเป็นศูนย์กลาง
andcoz

'ส่งออก' จำเป็นต้องใช้กับ $ PATH - ซึ่งมีอยู่แล้วน่าจะอยู่แล้ว?
esskov

@esskov ปกติไม่ใช่ ฉันจำได้ว่ามีเวอร์ชั่นเก่าของ sh บน AIX ที่จำเป็นต้องใช้ (ประมาณปี 1992) แต่อาจเป็นข้อผิดพลาดบางประเภท
andcoz

19

คุณสามารถทำได้โดยใช้แหล่งที่มาภายใน :

. script_name

เชลล์บางตัวจัดเตรียมนามแฝงที่มีชื่อซอร์ส :

source script_name

-1

ติดตั้ง Chocolatey @ unix แล้วคุณสามารถเรียกใช้ RefreshEnv เพื่อรับตัวแปรสภาพแวดล้อมที่อัปเดตไปยังเซสชันปัจจุบันของคุณ

รายละเอียด


1
คำถามที่คุณเชื่อมโยงด้วย (และคำตอบ) นั้นเกี่ยวกับ Windows   นี้เป็นคำถามเกี่ยวกับ Unix และ Linux เพื่อโพสต์ของคุณไม่ได้คำตอบนี้คำถาม
G-Man กล่าวว่า 'Reinstate Monica'

ติดตั้ง Chocolatey @ unix
小色狼

ตกลงคุณอ้างว่าคำตอบนี้ใช้ได้กับ Unix ลิงก์รายละเอียดของคุณยังไม่เกี่ยวข้อง โปรดระบุรายละเอียดเกี่ยวกับวิธีการทำงานใน Unix ลิงก์ไปยังเอกสารที่เชื่อถือได้จะดี แต่อย่าโพสต์แค่ลิงก์ ใส่ข้อมูลที่เกี่ยวข้องลงในคำตอบของคุณ …กรุณาอย่าตอบในความคิดเห็น; แก้ไขคำตอบของคุณเพื่อให้ชัดเจนและสมบูรณ์ยิ่งขึ้น
G-Man กล่าวว่า 'Reinstate Monica'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.