สคริปต์ BASH เพื่อตั้งค่าตัวแปรสภาพแวดล้อมไม่ทำงาน


137

ฉันได้เขียนสคริปต์ต่อไปนี้เพื่อตั้งค่าตัวแปรสภาพแวดล้อมบางอย่างเมื่อจำเป็น

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH

ด้านล่างคำสั่งและผลลัพธ์ที่ฉันเห็นบนเทอร์มินัลของฉัน: สคริปต์ทำงาน แต่ตัวแปรไม่ได้ถูกตั้งค่าในตอนท้าย

~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE

~$: 

เกิดอะไรขึ้น ขอบคุณล่วงหน้า. มีร์โก

คำตอบ:


193

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

คุณสามารถใช้คำสั่ง bash .(หรือsource) เพื่อรันคำสั่งสคริปต์ในสภาพแวดล้อมเชลล์ปัจจุบันและบรรลุสิ่งที่คุณต้องการเช่น

source ./script.sh
echo "$BASE"

จะผลิต

/home/develop/trees

sourceคำสั่งเห็นบ่อยในสคริปต์เป็นไวพจน์ทุบตีสำหรับ.ซึ่งเป็นส่วนหนึ่งของมาตรฐาน POSIX (เพื่อให้.สามารถใช้ได้ในประเช่น แต่sourceไม่ได้)

. ./script.sh     # identical to "source ./script.sh"

( . script.shและsource script.shจะค้นหาก่อนscript.shในPATHดังนั้นจึงปลอดภัยกว่าที่จะระบุเส้นทางไปscript.sh)


29
คุณไม่จำเป็นต้องexportผ่านตัวแปรไปยัง subshell, subshell เป็นสำเนาของเชลล์ปัจจุบันของคุณรวมถึงตัวแปรและฟังก์ชั่นอื่น ๆ ตัวแปรที่ส่งออกจะถูกคัดลอกไปยังกระบวนการใหม่ที่เกิดจากเชลล์โดยไม่คำนึงว่ากระบวนการนั้นเป็นเชลล์อื่นหรือไม่ ประการที่สอง.คือคำสั่ง POSIX สำหรับการจัดหา Bash เพิ่มsourceเป็นคำพ้องความหมายที่อ่านได้มากกว่า แต่คุณไม่สามารถเชื่อได้ว่ามันมีอยู่ใน sh สุดท้าย. ./scriptแทนที่จะเป็น. scriptถ้าคุณต้องการหลีกเลี่ยงความประหลาดใจ mywiki.wooledge.org/BashFAQ/060
geirha

โปรดทราบว่าถ้าคุณแหล่งสคริปต์และใช้ไปป์แล้วสภาพแวดล้อมที่มาจะไม่สามารถใช้ได้กับผู้ปกครอง เช่น 'source setit.sh' ไม่เป็นไร 'source setit.sh | tee setit.log' ไม่เป็นไร น่าแปลกใจ. ไม่เข้าใจง่าย
gaoithe

10

เมื่อคุณเรียกใช้สคริปต์สคริปต์จะทำงานใน subshell ตัวแปรนั้นใช้ได้ภายในบริบทของ subshell นั้นเท่านั้น ตั้งไว้ในคุณ.bashrcหรือ.profileและอ่านข้อมูลเกี่ยวกับ ตัวแปรและ subshells exportคำสั่งทำงานลงลำดับชั้น (เปลือกปัจจุบันและทุก subshells มัน) ไม่ได้ขึ้นอยู่กับในตัวอย่างของคุณ

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

. ./script.sh

ที่ทำให้มันทำงานในเปลือกปัจจุบันของคุณ แต่จะไม่ผ่านตัวแปรขึ้นลำดับชั้นอย่างใดอย่างหนึ่ง


5

ฉันมักต้องการตั้งค่าตัวแปรสภาพแวดล้อมโดยไม่ต้องยุ่งยาก

นี่คือสิ่งที่ฉันเพิ่มใน. bashrc ของฉันเพื่อใช้ความสะดวกสบายนี้

defect() {
    if [ $1 ] && [ -z $2 ]
    then
        eval 'export DEFECT=$1'
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}

-1

คุณสามารถลองสิ่งนี้

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.