มุมมองที่สมบูรณ์ของตำแหน่งที่ตัวแปร PATH ถูกตั้งค่าเป็น bash


17

ฉันได้อ่านในสองสถานที่ที่PATHมีการตั้งค่า/etc/profileหรือ.profileไฟล์ที่อยู่ในบ้าน dir

สถานที่เหล่านี้เป็นสถานที่เดียวที่ตั้งค่าเส้นทางหรือไม่ ฉันต้องการความเข้าใจที่ดีขึ้น

ในไฟล์เช่นแสดงความคิดเห็นต่อไปนี้กล่าว/etc/profile "system-wide .profile file for the Bourne shell"นั่นหมายความว่าไฟล์โปรไฟล์เป็นไฟล์กำหนดค่าหลักสำหรับการทุบตี?

ในไฟล์นั้นฉันไม่เห็นPATHการตั้งค่า var ทั้งหมด ใน.profileไฟล์ในโฮมไดเร็กทอรีมีบรรทัดนี้:

PATH="$HOME/bin:$PATH"

นั่นคือการรีเซ็ตPATHโดยรูปลักษณ์เพราะมันเชื่อมต่อ$PATHสตริงที่ตั้งค่าไว้เรียบร้อยแล้ว$HOME/bin:ใช่ไหม แต่ถ้าetc/profileและ~/.profileเป็นเฉพาะไฟล์การตั้งค่าPATHที่จะ$PATHมาจากในบรรทัดของรหัสที่หากยังไม่ได้กำหนดไว้ใน/etc/profile?

ใครบางคนที่มีประสบการณ์สามารถโปรดอธิบายรายละเอียดเกี่ยวกับPATHตัวแปรได้อย่างละเอียดหรือไม่? ขอบคุณ!

คำตอบ:


20

มีหลายสถานที่ที่PATHสามารถตั้งค่าได้

loginโปรแกรมกำหนดเป็นค่าเริ่มต้น วิธีกำหนดค่าเริ่มต้นนี้ขึ้นอยู่กับระบบ บนระบบ Linux ส่วนใหญ่ที่ไม่ได้ฝังตัวจะนำมาจาก/etc/login.defsด้วยค่าต่าง ๆ สำหรับรูทและสำหรับผู้ใช้รายอื่น ศึกษาlogin(1)คู่มือในระบบของคุณเพื่อดูว่ามันทำอะไร

ในระบบโดยใช้PAMเฉพาะpam_envโมดูลตัวแปรสภาพแวดล้อมที่สามารถตั้งค่าในแฟ้มทั้งระบบและแฟ้มต่อผู้ใช้/etc/environment~/.pam_environment

จากนั้นวิธีการส่วนใหญ่ในการเข้าสู่ระบบ (แต่ไม่ใช่งาน cron) เรียกใช้ล็อกอินเชลล์ซึ่งอ่านไฟล์การกำหนดค่าทั้งระบบและต่อผู้ใช้ ไฟล์เหล่านี้สามารถแก้ไขค่าของPATHโดยทั่วไปแล้วเพื่อเพิ่มรายการ แต่บางครั้งก็เป็นวิธีอื่น ไฟล์ใดบ้างที่อ่านขึ้นอยู่กับว่าเชลล์ล็อกอินคืออะไร เปลือกหอยบอร์น / POSIX สไตล์อ่านและ/etc/profile ~/.profileทุบตีอ่าน/etc/profileแต่สำหรับไฟล์ต่อผู้ใช้ก็เพียงอ่านไฟล์ที่มีอยู่ครั้งแรกใน~/.bash_profile, และ~/.bash_login ~/.profilezsh อ่าน/etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, และ/etc/zlogin ~/.zloginเซสชัน GUI จำนวนมากมีการโหลด/etc/profileและ~/.profileขึ้นอยู่กับตัวจัดการการแสดงผลบนสภาพแวดล้อมเดสก์ท็อปหรือสคริปต์เริ่มต้นเซสชันอื่น ๆ และวิธีการกระจายการตั้งค่าแต่ละครั้ง


4

ตัวแปร PATH เริ่มต้นมักจะถูกตั้งค่าใน/etc/profile บางครั้งผู้ดูแลระบบ sys จะวางตัวแปร PATH ไว้ในแหล่งที่มาด้วย/etc/profile.d

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

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

สำหรับการเข้าสู่ระบบเปลือกเฉพาะเส้นทางอาจจะกำหนดไว้ใน~/.bash_profile, ~/.bashrcหรือ.cshrc, หรือคล้ายกัน ผู้ใช้สามารถตั้งค่า PATH ที่นี่หากพวกเขาต้องการพา ธ เฉพาะสำหรับเชลล์ที่เฉพาะเจาะจงหรือหากพวกเขาเพิ่งจะเกิดขึ้นเพื่อรักษาความพึงพอใจส่วนตัวของพวกเขาที่นั่น

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

แน่นอนเชลล์มีตัวแปรสภาพแวดล้อมเช่นกันดังนั้นตัวแปรสภาพแวดล้อมท้องถิ่นสามารถเพิ่มหรือแทนที่ PATH เริ่มต้นในไฟล์การกำหนดค่าใด ๆ


ฉันเพิ่งตรวจสอบไฟล์ทั้งหมดที่คุณพูดถึง ~ / .bash_profile และ. cshrc ไม่มีอยู่จริง ไฟล์สคริปต์ 3 ไฟล์ใน /etc/profile.d dir: appmenu-qt5.sh, bash_completion.sh & vte.sh ไม่ได้ตั้งค่าตัวแปร PATH เช่นกัน คุณหมายความว่าอย่างไรกับ "เชลล์มีตัวแปรสภาพแวดล้อมด้วย" คือ PATH ที่ตั้งไว้ในโปรแกรมไบนารี / bin / bash เมื่อฉันเทอร์มินัล echo $ PATH ฉันได้รับ: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / เกม: / usr / local / เกม แต่ฉันไม่ได้มีความคิดที่ว่าสิ่งเหล่านี้จะถูกตั้งค่าจริงๆ
Larry Lawless

ฉันคิดว่าฉันค่อนข้างเข้าใจผิดคำถามของคุณฉันคิดว่าคุณกำลังขอตำแหน่ง PATH ทั้งหมดสามารถตั้งค่าได้ แต่ฉันคิดว่าคุณสนใจที่จะตั้งค่าPATH เป็นครั้งแรก /etc/bashrcเพื่อที่ดู สิ่งนี้จะกำหนดวิธีการเปิดตัว BASH ซึ่งควรรวมตัวแปรสภาพแวดล้อมเริ่มต้นทั้งหมด ในระบบของฉัน/etc/bashrcอ่านจาก/etc/profile.dแต่ดูเหมือนว่าคุณมี 3 ไฟล์เท่านั้น/etc/profile.dดังนั้น distro ของคุณอาจทำมันแตกต่างกัน
Klaatu von Schlacker

1
โดยทั่วไปฉันต้องการทราบรายละเอียดของมัน ฉันหวังว่าเคนทอมป์สันจะเป็นพ่อของฉัน :)
Larry Lawless

คุณจะไปถึงที่นั่น เชื่อฉันเถอะหลังจากที่คุณใช้สิ่งนี้เป็นประจำทุกวันมันจะเริ่มจมและตราบใดที่คุณถาม "ทำไม" และการอ่านเอกสารเพื่อหาคำตอบในที่สุดคุณก็เรียนรู้ได้มากมาย!
Klaatu von Schlacker

ใน Linux Mint 18 Cinnamon ต้องแน่ใจว่าได้ตรวจสอบ /etc/profile.d/jdk_home.sh ฉันเปลี่ยนชื่อไฟล์นี้เป็น jdk_home.sh.old และตอนนี้เส้นทางของฉันไม่ได้ถูกแทนที่และฉันสามารถเรียก java -version และดู Java 9 เป็น ที่คาดหวัง แม้ว่าฉันเลือก Java 9 อย่างถูกต้องใน update-aternatives --config java ไฟล์ jdk_home.sh นี้ยังคงแทนที่ $ PATH
flyingdrifter

3

วิธีเพิ่มคำตอบอื่น ๆ :

bashจะตั้งPATHเป็นค่าเริ่มต้นที่กำหนดค่าตายตัวหากไม่ได้ตั้งค่าไว้ในสภาพแวดล้อม บนเครื่อง Ubuntu Server 16.04.2 ฉันได้รับ:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

เราสามารถตรวจสอบว่าค่านี้เป็นรหัสตายตัวจริงๆและไม่ได้อ่านจากสภาพแวดล้อมหรือไฟล์บางส่วนโดยใช้stringsยูทิลิตี้:

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

อย่างไรก็ตามฉันได้รับผลลัพธ์ที่แตกต่างจากเครื่อง Arch Linux ของฉัน:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

ดังนั้นดูเหมือนว่าค่าเริ่มต้นนี้จะถูกเลือกในเวลาที่bashสร้างไบนารีซึ่งขึ้นอยู่กับ OS / การกระจายการใช้งาน


0

เนื้อหาที่ฉันไม่เห็น:

  • สิ่ง X
  • มาสเตอร์ไฟล์จากที่.profileอื่น ๆ จะถูกคัดลอกไปที่การสร้างบัญชี
  • pam_env
  • เธรดล่าสุดบนDebianซึ่งจะกล่าวถึงในรายละเอียดบางอย่าง

สำหรับ Ken Thompson คุณอาจประหลาดใจกับเขา: "Views on Linux" "การดูบนลินุกซ์"

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