ฉันจะเพิ่มตัวแปรสภาพแวดล้อมได้อย่างไร


364

ฉันใช้ Ubuntu 11.04 ฉันใช้เทอร์มินัลเพื่อเริ่มเซสชัน bash และฉันต้องการเพิ่มตัวแปรสภาพแวดล้อม:

$r@hajt:~$ env THEVAR=/example

แต่มันไม่ทำงาน มันแสดงให้เห็นตัวแปรทั้งหมดที่มี Thevar เป็นคนสุดท้าย แต่อีกสายหนึ่งที่จะenvไม่แสดงTHEVARanymore- env | grep THEVARผลตอบแทนอะไร

สคริปต์ที่มีการส่งออก ( export THEVAR=/example) หรือการกำหนดตัวแปรอื่น ๆ ( THEVAR=/example) ไม่ได้เพิ่มตัวแปรสภาพแวดล้อม

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

อัปเดต: ความหมายที่แท้จริงของคำถามของฉันคือ: https://stackoverflow.com/questions/496702/can-a-shell-script-set-environment-variables-of-the-calling-shell

(อย่างไรก็ตามฉันจะเลือกคำตอบที่ได้รับการโหวตมากที่สุดและปล่อยให้ชื่อที่แก้ไข - นั่นไม่ใช่สิ่งที่ฉันขอ)

env เรียกใช้โปรแกรมในสภาพแวดล้อมที่มีการปรับเปลี่ยนจากนั้นยกเลิกการเปลี่ยนแปลงทั้งหมด


1
เมื่อกำหนด / ส่งออกใน. bashrc จะทำงานได้อย่างถูกต้อง
อารมณ์เสีย


1
แล้วไงTHEVAR=/exampleล่ะ
Oleh Prypin

2
อื่น ๆ เกี่ยวกับตัวแปรทั่วโลกอันนี้ไม่ได้เพิ่มข้อ จำกัด ดังกล่าว ฉันจะแยกมัน
Lekensteyn

คำตอบ:


570

ในการตั้งค่าตัวแปรสำหรับเชลล์ปัจจุบันเท่านั้น :

VARNAME="my value"

หากต้องการตั้งค่าสำหรับเชลล์ปัจจุบันและกระบวนการทั้งหมดเริ่มต้นจากเชลล์ปัจจุบัน:

export VARNAME="my value"      # shorter, less portable version

หากต้องการตั้งค่าอย่างถาวรสำหรับเซสชันทุบตีในอนาคตทั้งหมดให้เพิ่มบรรทัดดังกล่าวใน.bashrcไฟล์ของคุณใน$HOMEไดเรกทอรีของคุณ

ในการตั้งค่าอย่างถาวรและทั้งระบบ (ผู้ใช้ทุกกระบวนการ) เพิ่มชุดตัวแปรใน / etc / environment:

sudo -H gedit /etc/environment

ไฟล์นี้ยอมรับเฉพาะการมอบหมายตัวแปรเช่น:

VARNAME="my value"

อย่าใช้exportคำสำคัญที่นี่

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


29
Shell config files such as ~/.bashrc, ~/.bash_profile, and ~/.bash_login are often suggested for setting environment variables. While this may work on Bash shells for programs started from the shell, variables set in those files are not available by default to programs started from the graphical environment in a desktop session. help.ubuntu.com/community/EnvironmentVariables
SudoSURoot

1
@ Mr.Hyde ใช่ว่าอาจเป็นสถานที่ที่เหมาะสม
MichałŠrajer

1
@BharadwajRaju เพราะในระบบ UNIX เก่าบางระบบสามารถส่งออกตัวแปรที่ตั้งค่าไว้แล้วเท่านั้น Solaris เก่าและ HP-UX เป็นต้น
MichałŠrajer

1
เมื่อคุณตั้งค่าตัวแปรสภาพแวดล้อมฉันจะดูได้อย่างรวดเร็วเพื่อให้แน่ใจว่าได้ตั้งค่าไว้อย่างไร
Rod

1
@Rodecho $myvar
Qwerty

29

ในการตั้งค่าตัวแปรสภาพแวดล้อมหนึ่งครั้งให้ใช้exportคำสั่งในพร้อมต์ไม่ใช่ในเชลล์สคริปต์:

$ export THEVAR=/example

ตัวแปรจะถูกตั้งค่าสำหรับส่วนที่เหลือของเซสชันเชลล์หรือจนกว่าจะไม่มีการตั้งค่า

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

ในการตั้งค่าตัวแปรสภาพแวดล้อมจากสคริปต์ให้ใช้exportคำสั่งในสคริปต์แล้วsourceเลือกสคริปต์ หากคุณรันสคริปต์มันจะไม่ทำงาน

สำหรับคำอธิบายความแตกต่างระหว่างการจัดหาและการดำเนินการให้ดูคำตอบนี้: https://superuser.com/questions/176783/what-is-the-the-difference-between-executing-a-bash-script-and-sourcing-a- ทุบตีสคริปต์ / 176788 # 176788


4
ฉันจะทำให้มันทำงานได้โดยการรันสคริปต์เท่านั้น? โดยไม่ต้องจัดหา
มิ ธ ริล

19

หากต้องการเพิ่มตัวแปรสภาพแวดล้อมใหม่ใน Ubuntu อย่างถาวร (ทดสอบเฉพาะใน 14.04) ให้ใช้ขั้นตอนต่อไปนี้:

  1. เปิดเทอร์มินัล (โดยการกดCtrlAltT)
  2. sudo -H gedit /etc/environment
  3. พิมพ์รหัสผ่านของคุณ
  4. แก้ไขไฟล์ข้อความที่เพิ่งเปิด
    ตัวอย่างเช่นถ้าคุณต้องการเพิ่มFOO=barจากนั้นก็เขียนFOO=barเป็นบรรทัดใหม่
  5. บันทึกไว้
  6. เมื่อบันทึกแล้วให้ออกจากระบบและลงชื่อเข้าใช้อีกครั้ง
  7. ทำการเปลี่ยนแปลงตามที่คุณต้องการ

5
ฉันได้ทำความสะอาดขึ้นคำตอบของคุณเอาบิตที่อันตรายมากขึ้นเกี่ยวกับsudo gedit(ดูaskubuntu.com/questions/270006/... ) chmod 777และ สิ่งหลังไม่ควรทำบนไฟล์การกำหนดค่าระบบ
muru

นี่เป็นคำตอบที่ถูกต้องสำหรับบางกรณี เซสชันทั้งหมดไม่ว่าจะเป็นเชลล์ผู้ใช้หรือไม่ก็ตามจะได้รับค่าของตัวแปรที่ตั้งไว้ที่นี่ เป็นสิ่งสำคัญที่จะต้องทราบว่าในขณะที่สิ่งนี้อาจดูเหมือนเชลล์สคริปต์ แต่ไม่ใช่ - อนุญาตให้คุณตั้งค่าตัวแปรสภาพแวดล้อมเท่านั้น (เทียบกับการใช้ฟังก์ชั่นเชลล์เช่นifหรือtest)
Tom Harrison Jr

หากแถบเป็นสตริงฉันควรใส่ไว้ระหว่างเครื่องหมายคำพูดหรือไม่ ชอบFoo="bar"ไหม
blue_chip

@blue_chip ไม่ทำงานโดยไม่มีเครื่องหมายอัญประกาศ
คลิกโหวต

4
@blue_chip สำหรับตัวแปรสภาพแวดล้อมทุกอย่างเป็นสตริง คุณต้องการเพียงเครื่องหมายคำพูดเมื่อมันมีช่องว่าง
Ruslan

8

ในการรับการเปลี่ยนแปลงสภาพแวดล้อม / var ให้คงอยู่หลังจากสคริปต์เสร็จสมบูรณ์คุณต้องใช้source ./script.shหรือเครื่องหมายย่อสำหรับแหล่งที่มา "." เช่น. ./script.sh

ซอร์สจะดำเนินการคำสั่งในสคริปต์ราวกับว่าคุณพิมพ์ไว้ใน ... ดังนั้นจึงเปลี่ยนบางแง่มุมของสคริปต์เช่นออก ... ดังนั้นหากสคริปต์ของคุณตรวจสอบบางอย่างและตัดสินใจที่จะออกหากเป็นเท็จเช่น การโทรexit 0จะยุติเซสชันเทอร์มินัล / เชลล์ปัจจุบันของคุณ


นี่เป็นคำถามเก่าแก่ที่มีคำตอบที่ยอมรับแล้วและอีกสองสามข้อ ... ลองพิจารณาตอบคำถามล่าสุดเพิ่มเติม
หน่อยได้ไหม

3
@NerdOfCode คำตอบนี้ระบุถึงปัญหาที่ยังคงมีความเกี่ยวข้องและไม่มีคำตอบอื่นใดรวมถึงคำตอบที่ยอมรับพูดถึงเท่าที่ฉันเห็น ... มีป้ายสองป้ายสำหรับการตอบคำถามเก่า ดังนั้นจึงได้รับการสนับสนุน
Zanna

1
นี่คือสิ่งที่ฉันกำลังมองหา ฉันต้องการดูสคริปต์ซึ่งเป็นตัวแปรที่ส่งออกจากสคริปต์
albanx

5

หากคุณกำลังทำสิ่งต่างๆผ่านสคริปต์วิธีหนึ่งที่ง่ายในการตั้งค่าตัวแปรสภาพแวดล้อมอย่างถาวรคือคำสั่งด้านล่างในสคริปต์ของคุณ

if [[ ! -d "$MyVar" ]]; then 
    export MyVar="abc"
    echo 'export MyVar="abc"' >> ~/.bashrc
fi

หากคุณต้องการประเมินนิพจน์เช่น pwd คุณสามารถใช้สิ่งนี้ได้เช่น

echo "export EIGEN_ROOT=\"$(pwd)/eigen\"" >> ~/.bashrc

1

ฉันรู้ว่ามันค่อนข้างช้า แต่ถ้าคุณต้องการเพิ่มตัวแปรสภาพแวดล้อมสำหรับผู้ใช้ทั้งหมด (เช่นการใช้งาน JAVA) - คุณสามารถทำสิ่งต่อไปนี้:

1) เปิด/etc/bash.bashrcใช้ nano (คุณสามารถใช้โปรแกรมแก้ไขอะไรก็ได้ฉันไม่ชอบ VIM เพราะมันแย่ที่สุดเมื่อพูดถึงมิตรต่อผู้ใช้ - ไม่มีอะไรเป็นส่วนตัว)

2) ผนวกเข้ากับไฟล์:

export VAR=path export PATH=$PATH:/bin 3) (ดีกว่าถ้าคุณสามารถตีกลับกล่อง) - หรือเพียงแค่เปิดเซสชัน SSH ใหม่และยืนยันโดยใช้คำสั่ง 'env'

แต่ถ้าคุณต้องการให้ผู้ใช้แต่ละคนมีการตั้งค่าแยกต่างหากสำหรับสิ่งนี้คุณต้องทำการเปลี่ยนแปลง (สคริปต์) เป็น.bashrcไฟล์ภายใต้~/.bashrc(หรือ/home/$USER/หากคุณยังใหม่กับระบบ Linux)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.