การตั้งค่าตัวแปรสภาพแวดล้อมส่วนกลางสำหรับทุกคน


17

ถ้าผมตั้งค่าตัวแปรในก็ดูเหมือนว่าจะนำไปใช้กับผู้บริหารในขณะที่/etc/environmentsudo su

ฉันจะทำให้ตัวแปรใช้กับทุกคนได้อย่างไร โดยเฉพาะอย่างยิ่งเมื่อพวกเขาอยู่ใน terminal? การตั้งค่า/etc/enviromentไม่เหมาะกับการทุบตีหรือไม่?

คำตอบ:


13

การ/etc/environmentอัปเดตจะใช้ได้เฉพาะในเซสชันถัดไปเท่านั้น แต่จะไม่โหลดใหม่โดยอัตโนมัติ

ซึ่งหมายความว่าคุณไม่สามารถเปลี่ยนแปลงได้สำหรับเซสชันที่เริ่มต้นแล้วสำหรับผู้ใช้รายอื่น

หากคุณต้องการ "โหลดซ้ำ" สิ่งที่อยู่ในนั้น/etc/environmentคุณต้องใช้คำสั่งต่อไปนี้:

source /etc/environment

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


4

TL; DR

ไฟล์กำหนดค่าเหล่านี้ไม่ว่าจะเป็นส่วนกลาง ( /etc/environment, /etc/profile) หรือเฉพาะผู้ใช้ ( ~/.profile, ~/.bashrc) จะได้รับการดำเนินการในการเข้าสู่ระบบ / ครั้งถัดไปเท่านั้น

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

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

สิ่งแวดล้อมโลก

ในฐานะที่เป็นคนอื่นที่กล่าวถึงคุณจะต้องรีบูตหรือออกจากระบบ / เข้าสู่ระบบเพื่อให้การเปลี่ยนแปลง/etc/profile, /etc/profile.d/*.shและ/etc/environmentจะหยิบขึ้นมา

นี่เป็นเพราะในขณะที่ไฟล์เหล่านี้ระบุสภาพแวดล้อมส่วนกลาง ... พวกเขาจะทำงานเพียงครั้งเดียวในการเข้าสู่ระบบและดังนั้นการเข้าสู่ระบบ / เซสชันที่มีอยู่จะไม่สะท้อนการเปลี่ยนแปลงของไฟล์เหล่านั้น การรีบูต "รีเซ็ต" ทุกคนเข้าสู่ระบบบังคับให้พวกเขาเลือกสภาพแวดล้อมใหม่

ในเซสชันการเข้าสู่ระบบของคุณเองคุณสามารถsource /etc/profileรับการเปลี่ยนแปลงโดยไม่ต้องรีบูตหรือออกจากระบบ / เข้าสู่ระบบ ... แต่จะมีผลเฉพาะเซสชันของคุณเองและกระบวนการใหม่ที่ทำงานภายในเซสชันของคุณ

โปรดทราบว่าไม่มีการแก้ไขตัวแปรใน/etc/environment(ไม่ใช่สคริปต์) ดังนั้นคุณจึงไม่สามารถทำสิ่งที่ต้องการPATH="$PATH:/my/custom/path"ได้

โปรดทราบว่า/etc/profileและ/etc/profile.d/*.shจะใช้สำหรับเซสชันการเข้าสู่ระบบเท่านั้นดังนั้นสภาพแวดล้อมที่กำหนดค่าจะไม่สามารถใช้ได้กับบัญชีที่ไม่ใช่ระบบการเข้าสู่ระบบ (เช่นถ้าคุณพยายามตั้งค่าตัวแปรสภาพแวดล้อมสำหรับกระบวนการ daemon ที่ทำงานนอกเปลือกการเข้าสู่ระบบของคุณ)

หมายเหตุว่าbashrcไม่เป็นประโยชน์สำหรับการตั้งค่าสภาพแวดล้อมสำหรับเปลือกเข้าสู่ระบบทั้งหมด แต่สำหรับเปลือกหอยทุบตีและกระบวนการย่อย ... เพื่อให้ความจริง "ทั่วโลก" หรือ "ผู้ใช้ทั่วโลก" คุณอาจต้องการที่จะนำการตั้งค่าสภาพแวดล้อมของคุณ/etc/profileหรือหรือ/etc/profile.d/my-custom-env.sh ~/.profileเชลล์อื่น ๆ (เช่น zsh) มีไฟล์กำหนดค่าของตัวเองเช่นกันดังนั้นการกำหนดค่าสภาพแวดล้อมที่ไม่เฉพาะเจาะจงของ bash ใน bashrc จะทำให้เกิดปัญหาหรือความสับสนหาก / เมื่อคุณสลับเชลล์ (หรือมีผู้ใช้อื่น ๆ บนระบบ

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

สำหรับผู้ใช้ที่เฉพาะเจาะจง

ดูที่การรวมสภาพแวดล้อมในโปรไฟล์หรือ bashrc ในโฮมไดเร็กตอรี่ของผู้ใช้ (เช่น~/.profile ~/.bashrc) ขึ้นอยู่กับว่าคุณต้องการสิ่งนี้สำหรับการโต้ตอบเชลล์ล็อกอิน, bash-only, ฯลฯ

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

สำหรับโปรแกรมเฉพาะมีสองตัวเลือก

หนึ่งคือการจัดเตรียมสภาพแวดล้อมเมื่อรันคำสั่ง:

VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2

หากคุณกำลังใช้ systemd คุณยังสามารถระบุสภาพแวดล้อมในแฟ้มหน่วย / บริการภายใต้[Service]ด้วยEnvironment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE

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

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

อ้างอิง:

นอกจากนี้ยังมีคำตอบโดยละเอียดที่นี่ซึ่งฉันขอแนะนำให้คุณอ่าน: /ubuntu//a/247769/824160


3

สร้างเชลล์สคริปต์ที่กำหนดเองภายใต้

/etc/profile.d/

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


ฉันเชื่อว่านี่เป็นวิธีที่เชื่อถือได้มากกว่าการแก้ไขไฟล์ / etc / environment เนื่องจากไฟล์นั้นอาจมีการเปลี่ยนแปลงเมื่อมีการอัพเดตแพ็คเกจ
phreed

2

การเพิ่มตัวแปรให้/etc/environmentเหมาะกับฉัน

อย่างไรก็ตามฉันต้องรีบูตเครื่องหลังจากเปลี่ยน/etc/environmentเพื่อให้การเปลี่ยนแปลงมีผล เพียงแค่ปิดและเปิดหน้าต่างเทอร์มินัลใหม่ไม่เพียงพอ


3
คุณสามารถทำการsource /etc/environmentโหลดซ้ำได้ตลอดเวลา
Panthro

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