การตั้งค่าตัวแปร PATH ใน / etc / environment vs .profile


58

สถานที่ที่ต้องการตั้งค่าPATHenvvar อยู่ที่ไหน

~/.profileหรือ/etc/environment?

จะเกิดอะไรขึ้นเมื่อPATHทั้งสองสถานที่ตั้งขึ้น ผลลัพธ์ที่ได้คือการต่อกันของค่าทั้งสองที่กำหนดไว้ในสองแห่งนั้นหรือไม่?


แน่นอนว่าการมอบหมายครั้งสุดท้ายให้กับ PATH นั้นมีผลบังคับใช้แน่นอน สคริปต์ส่วนใหญ่ตั้งค่าไว้ที่จุดเริ่มต้นของสคริปต์อย่างชัดเจน
AlexP

คำตอบ:


69

สรุป:

  • หากคุณต้องการเพิ่มเส้นทาง (เช่น/your/additional/path) ให้กับPATHตัวแปรของคุณสำหรับผู้ใช้ปัจจุบันเท่านั้นและไม่ใช่สำหรับผู้ใช้ทั้งหมดของคอมพิวเตอร์ของคุณโดยปกติคุณจะใส่มันไว้ท้ายสุดของ~/.profileตัวอย่างหนึ่งในสองตัวอย่างนี้:

    PATH="/your/additional/path:$PATH"
    PATH="$PATH:/your/additional/path"
    

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

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


รายละเอียดเพิ่มเติม:

  • /etc/environmentเป็นไฟล์การกำหนดค่าทั่วทั้งระบบซึ่งหมายความว่าผู้ใช้ทุกคนจะใช้ไฟล์นี้ มันเป็นเจ้าของโดยrootดังนั้นคุณจะต้องเป็นผู้ใช้ผู้ดูแลระบบและใช้sudoในการแก้ไข

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

  • /etc/profileและ/etc/profile.d/*.shเป็นสคริปต์การเริ่มต้นสากลที่เทียบเท่ากับ~/.profileผู้ใช้แต่ละคน สคริปต์โกลบอลจะถูกเรียกใช้งานก่อนสคริปต์เฉพาะผู้ใช้ และสคริปต์หลัก/etc/profileจะเรียกใช้งาน*.shสคริปต์ทั้งหมด/etc/profile.d/ก่อนที่จะออก


  • /etc/environmentไฟล์ดังกล่าวมีเพียงบรรทัดนี้เท่านั้น:

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    

    มันตั้งค่าPATHตัวแปรสำหรับผู้ใช้ทั้งหมดในระบบให้เป็นค่าเริ่มต้นนี้ซึ่งไม่ควรเปลี่ยนในทางที่สำคัญ อย่างน้อยคุณไม่ควรลบใด ๆ ของเส้นทางที่สำคัญเช่น/bin, /sbin, /usr/binและ/usr/sbinจากมัน

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

  • ~/.profileไฟล์สามารถมีหลายสิ่งหลายอย่างโดยค่าเริ่มต้นจะมีในหมู่สิ่งอื่น ๆ ตรวจสอบไม่ว่าจะเป็น~/binไดเรกทอรีที่มีอยู่และเสริมว่าที่มีอยู่ของผู้ใช้PATHตัวแปรเช่นนี้ (พี่อูบุนตูเผยแพร่ก่อน 16.04 - รุ่นใหม่เพิ่มโดยไม่มีเงื่อนไข):

    # set PATH so it includes user's private bin if it exists
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    

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

    สคริปต์การเริ่มต้นนี้อ่านได้โดยเชลล์ของผู้ใช้ที่เป็นเจ้าของ แต่มีเงื่อนไขอื่น:

    # ~/.profile: executed by the command interpreter for login shells.
    # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
    # exists.
    

    ดังนั้นหากคุณใช้ Bash เชลล์เริ่มต้นคุณควรตรวจสอบให้แน่ใจว่าคุณไม่มี~/.bash_profileหรือ~/.bash_loginถ้าคุณต้องการให้การเปลี่ยนแปลง~/.profileมีผลกับผู้ใช้ของคุณ


สำหรับความเข้าใจอย่างสมบูรณ์เกี่ยวกับตัวแปรสภาพแวดล้อมดูที่: https://help.ubuntu.com/community/EnvironmentVariables


คำถามที่เกี่ยวข้อง: ความแตกต่างระหว่างไฟล์ bash.bashrc และ / etc / environment


2
ทุกวันนี้~/.profileไม่ได้ตรวจสอบการดำรงอยู่ของ~/binมัน แต่มันมีเพียงบรรทัด:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
Gunnar Hjalmarsson

1
@GunnarHjalmarsson กำหนด "วันนี้" ได้ไหม ฉันวิ่ง 16.04 และมันก็เป็นแบบนั้น
Byte Commander

2
/etc/skel/.profileใน 16.04 มีบรรทัดที่ฉันพูดถึง เห็นได้ชัดว่าคุณสร้างผู้ใช้ของคุณในรุ่นก่อนหน้า
Gunnar Hjalmarsson

1
@GunnarHjalmarsson ขอบคุณสำหรับข้อมูล - จนกระทั่งประมาณห้านาทีที่แล้วฉันคิดว่าค่าเริ่มต้น~/.profileยังคงเป็นเช่นนี้ แต่คุณก็ถูกต้อง - /etc/skel/.profileไม่มีในระบบ 16.04 ที่อัปเกรดแล้วของฉัน (และบัญชีผู้ใช้ที่สร้างขึ้นเมื่อติดตั้ง 16.04 ใน เครื่องอื่นไม่มีในเครื่อง.profile)
Eliah Kagan

2
"... ดำเนินการเป็นเชลล์สคริปต์ปกติโดยเชลล์ทั้งหมดในระหว่างการเริ่มต้น" ฉันคิดว่านี่เป็นสิ่งที่ทำให้เข้าใจผิด อาจขอแนะนำ (สำหรับบางคน) ว่าการเปิดเชลล์เทอร์มินัลที่ไม่ใช่การเข้าสู่ระบบจากเดสก์ท็อป GUI จะดำเนินการ / etc / profile ซึ่งจะไม่ทำงาน askubuntu.com/questions/155865/…
Hawkeye Parker

22

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

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

ในฐานะที่เป็นAlexP กล่าวว่าที่PATHตัวแปรสภาพแวดล้อมจะมีค่าก็มอบหมายส่วนใหญ่เมื่อเร็ว ๆ นี้ ในทางปฏิบัติเวลาส่วนใหญ่ที่คุณตั้งไว้PATHคุณรวมค่าเก่าของPATHในค่าใหม่เพื่อให้รายการก่อนหน้าจะถูกเก็บไว้

ดังนั้นในทางปฏิบัติเมื่อPATHตั้งค่าจากหลายไฟล์มักจะมีรายการที่กำหนดในไฟล์ทั้งหมด แต่เกิดขึ้นเพราะไฟล์ทั้งหมดที่ตั้งค่ายกเว้นไฟล์แรกมักจะอ้างอิงPATHตัวแปรตัวเองทำให้ค่าเก่าของมันรวมอยู่ในไฟล์ใหม่

ดังนั้นคุณจะถามถึงลำดับที่PATHการตั้งค่าในไฟล์ต่างๆมีผล

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

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

1. สำหรับผู้ใช้ทั้งหมด: /etc/environment

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

$ cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

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

sudo cp /etc/environment /etc/environment.orig

.origนามสกุลไม่จำเป็นต้องเฉพาะ - คุณสามารถรู้สึกดีเกี่ยวกับการตั้งชื่ออะไรแฟ้มสำรองข้อมูลที่ไม่ทำให้เกิดความสับสนหรือมีอยู่แล้วถูกนำมาใช้ (นอกจาก.orig, .old, .backupและ.bakเป็นเรื่องธรรมดา.)

คุณสามารถแก้ไขไฟล์นี้ในวิธีใด ๆ ที่คุณอาจแก้ไขไฟล์อื่นใดตามที่ผู้ใช้ราก ( sudoedit /etc/enviromnment, sudo nano -w /etc/environment, gksudo gedit /etc/environmentฯลฯ )

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

2. สำหรับผู้ใช้ทั้งหมด: /etc/security/pam_env.conf

PAM อ่านตัวแปรสภาพแวดล้อมสำหรับผู้ใช้ทั้งหมดจากที่/etc/security/pam_env.confระบุด้วยไวยากรณ์เดียวกับที่ใช้ใน~/.pam_environmentไฟล์ต่อผู้ใช้(ดูด้านล่าง)

เมื่อตัวแปรสภาพแวดล้อมเดียวกันมีการตั้งค่าทั้งใน/etc/environmentและ/etc/security/pam_env.confค่าในการpam_env.confถูกนำมาใช้ - แม้ว่าค่าที่ถูกระบุเป็นมากกว่าDEFAULTOVERRIDE

อย่างไรก็ตามเมื่อคุณแทนที่บรรทัดenvironmentด้วยหนึ่งในpam_env.confคุณสามารถรวมเนื้อหาของค่าที่ถูกแทนที่ ดูรายละเอียดในส่วนด้านล่าง.pam_environment(เนื่องจากใช้ไวยากรณ์เดียวกัน)

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

#PATH           DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11

สิ่งนี้นำเสนอเป็นหนึ่งในหลายตัวอย่าง \หนึ่งในสิ่งที่มันแสดงให้เห็นถึงวิธีการแบ่งงานในหลายเส้นด้วย สมมติว่าคุณต้องยกเลิกการใส่เครื่องหมายความคิดเห็นในบรรทัดแรก แต่ลืมยกเลิกการแสดงความคิดเห็นบรรทัดที่สอง:

PATH           DEFAULT=${HOME}/bin:/usr/local/bin:/bin\
#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11

อย่าทำอย่างนี้!

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

3. สำหรับผู้ใช้หนึ่งราย: .pam_environmentในโฮมไดเรกทอรีของผู้ใช้

อีกวิธีหนึ่งในการตั้งค่าตัวแปรสภาพแวดล้อมสำหรับผู้ใช้คนเดียวคือให้ผู้ใช้นั้นแก้ไข (หรือสร้าง) .pam_environmentในโฮมไดเร็กตอรี่ของพวกเขา ค่าที่ตั้งไว้ในไฟล์นี้แทนที่ค่าที่ตั้งใน/etc/environmentไฟล์โกลบอล

.pam_environmentไม่ได้เป็นส่วนหนึ่งของโครงกระดูกของไฟล์ที่คัดลอกไปยังโฟลเดอร์เริ่มต้นของผู้ใช้เมื่อสร้างบัญชีผู้ใช้ครั้งแรก PATHแต่ถ้าคุณสร้างไฟล์ที่อยู่ในไดเรกทอรีบ้านของคุณคุณสามารถใช้มันเพื่อตั้งค่าตัวแปรสภาพแวดล้อมเช่น ซึ่งแตกต่างจาก/etc/environment(แต่ชอบ/etc/security/pam_env.conf) .pam_environmentไฟล์สำหรับผู้ใช้แต่ละรายรองรับการขยายค่าเก่าของตัวแปรสภาพแวดล้อมไปยังไฟล์ใหม่ อย่างไรก็ตามไม่ใช่สคริปต์ของเชลล์และคุณต้องใช้ไวยากรณ์พิเศษเพื่อให้ได้สิ่งนี้ซึ่งแตกต่างจากไวยากรณ์ที่คุณจะใช้ในไฟล์เช่น.profileนี้

ตัวอย่างเช่นหากคุณมีbin2ไดเรกทอรีในโฮมไดเรกทอรีที่คุณต้องการเพิ่มในตอนท้ายPATHคุณสามารถทำได้โดยเพิ่มบรรทัดนี้ไปที่.pam_environment:

PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2

ดูย่อยของEnvironmentVariables (จากตัวอย่างข้างต้นจะปรับอย่างใกล้ชิด) และสำหรับรายละเอียดเพิ่มเติม~/.pam_environmentman pam_envman pam_env.conf

แม้ว่านี่จะได้รับการขนานนามว่าครั้งเดียวเป็นวิธีที่ต้องการสำหรับผู้ใช้อูบุนตูเปลี่ยนแปลงหรือเพิ่มตัวแปรสภาพแวดล้อมและยังคงถือเป็นทางเลือกที่เหมาะสมและเป็นที่ยอมรับ, คุณควรจะระมัดระวังเมื่อมีการแก้ไข .pam_environmentเช่นเดียวกับการแก้ไขทั้งระบบ/etc/security/pam_env.conf(ดูด้านบน) บรรทัดที่มีรูปแบบไม่ถูกต้องใน.pam_environmentไฟล์ของผู้ใช้จะป้องกันการเข้าสู่ระบบไม่สำเร็จ (ฉันมีการทดสอบนี้. - เกี่ยวกับวัตถุประสงค์ในครั้งนี้) สำหรับข้อมูลเกี่ยวกับวิธีการแนะนำที่มีวิวัฒนาการมาดูGunnar Hjalmarsson 's ความคิดเห็น ด้านล่างและนี้ubuntu-develการอภิปราย

ข้อผิดพลาดดังกล่าวมีความร้ายแรงน้อยกว่าโดยทั่วไปมากกว่าบรรทัดที่มีรูปแบบไม่ถูกต้องpam_env.confเนื่องจากมีผลกับผู้ใช้เพียงรายเดียว อย่างไรก็ตามในกรณีของระบบ Ubuntu บนเดสก์ท็อปที่มีบัญชีผู้ใช้เดียวที่อนุญาตให้เข้าสู่ระบบข้อผิดพลาดในขณะที่การแก้ไข.pam_environmentจะไม่ดีเท่ากับการแก้ไขข้อผิดพลาดpam_env.conf- หากคุณยังไม่ได้เข้าสู่ระบบคุณจะไม่สามารถทำได้ เพื่อแก้ไขโดยไม่ต้องบูตในโหมดการกู้คืน (หรือจาก USB สด ฯลฯ )

(หากคุณมีบัญชีผู้ใช้อื่นคุณสามารถเข้าสู่ระบบในฐานะผู้ใช้รายอื่นและแก้ไขปัญหาแม้ว่าพวกเขาจะไม่ได้เป็นผู้ดูแลระบบและไม่สามารถsudoรูทพวกเขายังสามารถเรียกใช้และได้รับแจ้งให้ป้อนรหัสผ่านของคุณ อย่างไรก็ตามบัญชีguestไม่สามารถทำได้เนื่องจากถูกห้ามไม่ให้ใช้เพื่อระบุตัวตนของผู้ใช้รายอื่น)su your-accountsu

4. สำหรับผู้ใช้ทั้งหมด: /etc/profileและไฟล์ภายใน/etc/profile.d/

เชลล์ที่เข้ากันได้กับเป้าหมาย (รวมถึงbashเชลล์ผู้ใช้เริ่มต้นใน Ubuntu) เรียกใช้คำสั่ง/etc/profileเมื่อเรียกใช้เป็นเชลล์ล็อกอิน

Ubuntu /etc/profile.dจบลงด้วย:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

สิ่งนี้ทำให้คำสั่งในไฟล์ใด ๆ ใน/etc/profile.d/ไดเร็กทอรีที่มีชื่อลงท้ายด้วย.shให้รันเช่นกัน

ตัวจัดการหน้าจอส่วนใหญ่ทำให้คำสั่งใน/etc/profile(และทำให้ไฟล์ใน/etc/profile.d) ถูกเรียกใช้สำหรับการเข้าสู่ระบบแบบกราฟิกด้วย อย่างไรก็ตามไม่ใช่ทั้งหมดทำและนั่นเป็นข้อโต้แย้งที่สำคัญในความโปรดปรานของการใช้สิ่งอำนวยความสะดวกที่จัดทำโดย PAM แทน (ดูด้านบน) - เว้นแต่จะไม่มีการลงชื่อเข้าใช้แบบกราฟิกใด ๆ ในระบบนี้ซึ่งอาจเป็นกรณีตัวอย่างเช่น เซิร์ฟเวอร์ที่ไม่มี GUI ติดตั้ง

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

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

/etc/profileเป็นเชลล์สคริปต์และไวยากรณ์ที่เป็นไม่ได้เช่นเดียวกับที่ของแฟ้มการกำหนดค่า PAM ที่กล่าวข้างต้น ไวยากรณ์ของมันเหมือนกับไวยากรณ์สำหรับไฟล์ต่อผู้ใช้~/.profile(ดูด้านล่าง)

หากคุณต้องการเขียนโค้ดที่ตัดสินใจว่าจะเพิ่มไดเรคทอรีเฉพาะลงในPATH(และการทำเช่นนั้นสำหรับผู้ใช้ทั้งหมด) คุณจะไม่สามารถใช้/etc/environmentหรือ/etc/security/pam_env.confทำเช่นนั้นได้ นี้อาจจะเป็นสถานการณ์หลักที่มันจะดีกว่าที่จะใช้/etc/profileหรือ/etc/profile.d/แทน

5. สำหรับผู้ใช้หนึ่งราย: .bash_profileในโฮมไดเร็กตอรี่ของผู้ใช้

หากผู้ใช้มี~/.bash_profileทุบตีใช้มันแทน~/.profileหรือ~/.bash_login(ดูด้านล่าง) โดยปกติคุณไม่ควรมี.bash_profileไดเรกทอรีในบ้านของคุณ

หากคุณทำเช่นนั้นมักจะมีคำสั่งไปยังแหล่งที่มา~/.profile(เช่น, . "$HOME/.profile") มิฉะนั้นเนื้อหาของไฟล์ต่อผู้ใช้.profileจะไม่ทำงานเลย

6. สำหรับผู้ใช้หนึ่งราย: .bash_loginในโฮมไดเร็กตอรี่ของผู้ใช้

หากผู้ใช้มี~/.bash_loginทุบตีใช้มันแทน~/.profile(ดูด้านล่าง) เว้นแต่จะ~/.bash_profileมีอยู่ซึ่งในกรณีนี้จะไม่ใช้ของผู้อื่นเว้นแต่จะมีที่มาจาก `~ / .bash_login

เช่นเดียวกับ.bash_profileคุณไม่ควรมี.bash_loginไฟล์ในโฮมไดเร็กตอรี่ของคุณ

7. สำหรับผู้ใช้หนึ่งราย: .profileในโฮมไดเร็กตอรี่ของผู้ใช้

เมื่อเชลล์สไตล์ Bourne ถูกเรียกใช้เป็นเชลล์ล็อกอินเชลล์จะรันคำสั่งใน/etc/profile(ซึ่งโดยปกติจะมีคำสั่งที่ทำให้คำสั่งในไฟล์/etc/profile.d/ที่จะรัน - ดูด้านบน) หลังจากนั้นจะรันคำสั่งใน.profileไดเรกทอรีหลักของผู้ใช้ ไฟล์นี้แยกต่างหากสำหรับผู้ใช้ทุกคน (ทุบตีทำงานจริง.bash_profileหรือ.bash_loginแทนหากมีอยู่ - แต่สำหรับผู้ใช้ในระบบ Ubuntu ไฟล์เหล่านั้นแทบจะไม่ควรทำหรือมีอยู่สำหรับรายละเอียดดูด้านบนและ6.2 Bash Startup Filesในคู่มือ Bash )

~/.profileจึงเป็นสถานที่หลักสำหรับผู้ใช้ในการวางคำสั่งที่ทำงานเมื่อพวกเขาเข้าสู่ระบบ มันเป็นสถานที่ดั้งเดิมสำหรับคุณในการตั้งค่าของคุณPATHแต่เนื่องจาก Ubuntu มีโมดูล pam_env และการสนับสนุน~/.pam_environmentคุณควรพิจารณาใช้สิ่งนั้น

เช่นเดียวกับ/etc/profileที่ไม่ได้ทั้งหมดผู้จัดการแสดงผลเรียกใช้แฟ้มนี้สำหรับการเข้าสู่ระบบกราฟิกแม้ว่าส่วนใหญ่ทำ นี่คือเหตุผลที่จะต้องการ~/.pam_environmentสำหรับการตั้งค่าตัวแปรสภาพแวดล้อม (มากที่สุดเท่าที่หนึ่งอาจจะชอบ/etc/environmentที่จะ/etc/profile)

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

ตัวอย่างเช่น.profileไฟล์ต่อผู้ใช้เริ่มต้นบน Ubuntu ที่ใช้ลงท้ายด้วย:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

ดูความคิดเห็นของGunnar Hjalmarssonเกี่ยวกับคำตอบของผู้บัญชาการ Byteสำหรับรายละเอียด

วิธีนี้จะตรวจสอบว่าคุณมีbinไดเรกทอรีย่อยของโฮมไดเร็กตอรี่ของคุณหรือไม่ PATHถ้าเป็นเช่นนั้นจะเพิ่มไดเรกทอรีย่อยที่จุดเริ่มต้นของคุณ

รายการนั้นมีความเป็นไปได้บางอย่าง

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

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

ตั้งแต่bashเป็นเปลือกเข้าสู่ระบบของ Ubuntu เริ่มต้นสำหรับผู้ใช้และผู้ใช้ส่วนใหญ่ใช้หรือข้อมูลบางอย่างที่เปลือก POSIX ได้ผมเคยละเว้นอื่น ๆ เกี่ยวกับวิธีการที่ตัวแปรสภาพแวดล้อมที่มีการตั้งค่าอื่น ๆ tcshในหอยไม่ใช่บอร์นสไตล์เช่น


1
[ความคิดเห็นที่ 1 จาก 2] ขอบคุณสำหรับคำอธิบายที่กว้างขวางนี้! (ฉันแก้ไขเล็กน้อย) อย่างไรก็ตามฉันมีข้อสงสัยตามวิธีที่แนะนำ ไม่กี่ปีที่ผ่านมาEnvironmentVariablesกล่าวถึง/etc/environment/ ~/.pam_environmentเป็นไฟล์แนะนำ หลังจากปรึกษากับนักพัฒนาแล้วฉันเปลี่ยนมันให้เป็นกลางระหว่าง PAM และ/ และฉันก็ยังมีแนวโน้มที่จะมองอย่างนั้น /etc/profile.d/*.sh~/.profile
Gunnar Hjalmarsson

1
[ความคิดเห็น # 2 จาก 2] คุณพูดถึงข้อโต้แย้งสองประการเพื่อสนับสนุน PAM ข้อโต้แย้งที่สำคัญที่สนับสนุน/etc/profile.d/*.sh/ ~/.profileคือว่าไวยากรณ์นั้นง่ายกว่าและ lightdm / gdm นั้นจะถูกอภัยในกรณีที่เกิดข้อผิดพลาด (ไม่ใช่แม้แต่ข้อผิดพลาดทางไวยากรณ์ที่ทำให้คุณไม่สามารถเข้าสู่ระบบได้ แต่เพียงส่งผลให้ข้อความเตือน)
Gunnar Hjalmarsson

เมื่อคุณพูดว่าpam_env.soคุณหมายถึงpam_env.confอะไร
Johan Boulé

@ pam_env.confJohanBouléใช่ฉันไม่ได้หมายถึง ขอบคุณ! ฉันแก้ไขเพื่อแก้ไข
Eliah Kagan

3

ไฟล์ / etc / environmentไม่ใช่ไฟล์สคริปต์ที่คุณไม่สามารถใช้ส่งออกได้และไม่รองรับการขยายตัวแปรประเภท $ HOME เพียงแค่ simplevariable = คู่ค่า เพื่อที่จะใช้ไฟล์นั้นคุณจะต้องต่อท้ายพา ธ ของคุณไปยังคำจำกัดความที่มีอยู่นั้นมีความหมายเฉพาะสำหรับการตั้งค่าตัวแปรสภาพแวดล้อมทั้งระบบ หนึ่งรายการต่อบรรทัด ไฟล์นี้จัดเก็บการตั้งค่าตำแหน่งที่ตั้งและพา ธ ทั่วทั้งระบบ

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


1

สถานที่ที่ต้องการตั้งค่าตัวแปรสภาพแวดล้อมขึ้นอยู่กับหลายสิ่ง:

  1. คุณเป็นคนเดียวที่ใช้คอมพิวเตอร์:
    • ในกรณีนี้สถานที่ที่ดีที่สุดในการตั้งค่าจะอยู่ใน/etc/environmentเนื่องจากไม่มีอันตรายจากการเข้าถึงที่ไม่ได้รับอนุญาต
  2. หากระบบมีการใช้งานมากมาย
    • ถ้าตัวแปรควรเข้าถึงได้โดยทั้งหมดตำแหน่งก็จะเป็น/etc/environmentเช่นนั้น
    • หากผู้ใช้แต่ละคนควรเลือกการเข้าถึงพวกเขาแต่ละคนควรตั้งค่าของพวกเขาในการ~/.profileเกี่ยวข้องกับผู้ใช้แต่ละคนของระบบเนื่องจากมันอยู่ในไดเรกทอรีบ้านของผู้ใช้แต่ละคน

ระบบจะอ่านก่อนที่จะอ่าน/etc/environment ~/.profileไม่มีการต่อข้อมูลที่เกิดขึ้นและเช่นเดียวกับAlex Pกล่าวว่าการมอบหมายครั้งสุดท้ายไปยังเส้นทางมีผลบังคับใช้

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับปัจจัยที่กำหนดวิธีการ~/.profileและ/etc/environmentเล่นกับสถานที่อื่น ๆ ไปที่นี่และที่นี่เนื่องจากปัจจัยเหล่านี้จะมีผลต่อการใช้สถานที่เหล่านี้

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