PATH บน Mac OS คืออะไร


12

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

ดังนั้นอะไรคือจุดประสงค์PATHและความแตกต่างระหว่าง/etc/pathsและ~/.bash_profile** คืออะไร

ตัวอย่างเช่นในpathsไฟล์ของฉันฉันเห็นสิ่งนี้:

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

แต่ในของ~/.bash_profileฉันฉันเห็นสิ่งนี้:

# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH

นี่เป็นเพียงส่วนเพิ่มเติมเฉพาะของผู้ใช้ในpathsไฟล์หรือไม่ มีอะไรอยู่ในpathsนั้น/usr/binบ้างไหม?


2
โปรดอย่ารวมคำถามหลายข้อไว้ในโพสต์เดียว ยินดีต้อนรับคำถามของคุณแต่ละข้อที่นี่แยกจากกัน แต่ไม่ใช่ทั้งหมดพร้อมกันเช่นนี้ โปรดตัดคำถามนี้ให้เหลือเพียงคำถามเดียวคุณสามารถรวม 1 และ 2 ได้ แต่คำถามอื่น ๆ ไม่เกี่ยวข้องกับ PATH โดยเฉพาะ 3 มีคำตอบที่นี่ 4 มีการอธิบายที่นี่และ 5 ไม่สมเหตุสมผลมากที่ฉันกลัว และคำถามโบนัสของคุณหรือไม่ไฟล์อะไรเป็นไบนารี? สคริปต์ไม่ได้
terdon

ฉันได้แก้ไขคำถามของฉันลง นอกจากนี้ฉันพบว่าลิงก์เหล่านั้นมีประโยชน์ ขอบคุณ
gwg

คำตอบ:


15

1. PATH มีจุดประสงค์อะไร?

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

/usr/bin:/bin:/home/bin

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

2. อะไรคือความแตกต่างระหว่าง / etc / path และ ~ / .bash_profile

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

สำหรับบันทึกแล้ว/etc/pathsดูเหมือนว่าจะเป็นลักษณะเฉพาะของ MAC OS: ฉันไม่ได้เจอ GNU / Linux อย่างน้อย


ฉันเพิ่งแก้ไขพวกเขา แต่ขอบคุณที่ตอบทุกคน!
gwg

@ggundersen ฉันตัดแต่งคำตอบเพื่อให้เหมาะกับคำถามที่คุณแก้ไข
โจเซฟอาร์

@ggundersen คุณอาจต้องการอ่านคำตอบและลิงก์/etc/pathsใน OSX
terdon

7

PATH มีจุดประสงค์อะไร?

มันเป็นวิธีที่เชลล์ของคุณค้นหาโปรแกรม เมื่อคุณพิมพ์lsตัวอย่างเช่นที่กำลังเรียกใช้โปรแกรมที่เรียกว่าlsซึ่งอาศัยอยู่ใน/binในระบบส่วนใหญ่รวมถึง Mac OS X ได้เปลือกของคุณสามารถหาว่าเป็นเพราะอยู่ใน/binPATH

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

อะไรคือความแตกต่างระหว่าง / etc / path และ ~ / .bash_profile

พา ธ ที่ตั้งค่า/etc/pathsจะถูกเพิ่มไปยังPATHเมื่อเริ่มต้นในทุกเชลล์บน Mac OS X

~/.bash_profileเป็นเพียงหนึ่งในสคริปต์เชลล์หลายตัวที่รันโดย Bash เมื่อเริ่มต้นและหลาย ๆ ตัวเป็น Bash-specific ดังนั้นหากคุณเปลี่ยนเชลล์ - Mac OS X จะมีการจัดส่งtcshและzshตัวอย่างเช่น - การเปลี่ยนแปลงที่ทำขึ้นเพื่อ/etc/bashrcไม่ให้ใช้กับเชลล์ใหม่ของคุณ

นอกจากนี้ยัง/etc/pathsเป็นไฟล์การกำหนดค่าระดับระบบในขณะที่~/.bash_profileต่อผู้ใช้ หากคุณมีผู้ใช้หลายแบบโต้ตอบการตั้งค่าบน Mac ของคุณ, คุณจะไม่ต้องการที่จะเพิ่มไดเรกทอรีที่คุณไม่ต้องการให้ปรากฏในของทุกคน/etc/paths PATHเช่นเดียวกับที่เป็นจริง/etc/bashrcยกเว้นว่าจะใช้กับผู้ใช้ที่ใช้ Bash เป็นเชลล์เท่านั้น

PATH แตกต่างจาก $ PATH และ $ {PATH} ต่างกันอย่างไร

โดยปกติคุณจะเห็นตัวแปรที่ไม่มีเครื่องหมายเมื่อคุณตั้งค่าตัวแปร FOO=barกำหนดตัวแปรสภาพแวดล้อมสตริงFOO barหากคุณพิมพ์setเชลล์จะแสดงตัวแปรสภาพแวดล้อมทั้งหมดให้คุณเห็นและในกรณีนั้นคุณจะเห็นตัวแปรโดยไม่มีเครื่องหมายใด ๆ

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

$ FOO=bar
$ echo $FOO
bar
$ echo $FOOx

$ echo ${FOO}x
barx

ในechoคำสั่งที่สองเชลล์ไม่พิมพ์อะไรเลยเพราะมันขอให้เชลล์พิมพ์ตัวแปรที่เรียกว่าFOOxซึ่งไม่มีอยู่จริง เชลล์ถือว่าตัวแปรที่ไม่มีอยู่เป็นค่าว่าง เนื่องจากตัวที่สามechoใช้ซินโครไนซ์ปีกกามันทำให้เชลล์เห็นว่าคุณกำลังร้องขอFOOตัวแปรและนั่นxเป็นเพียงอักขระอื่นที่คุณต้องการพิมพ์ทันทีหลังจากนั้น

มีอีกวิธีหนึ่งที่จะได้เอฟเฟกต์แบบเดียวกันโดยไม่ต้องใช้เครื่องมือจัดฟันแบบโค้งโดยวิธี:

$ echo "$FOO"x
barx

ตัวแปรสภาพแวดล้อมถูกขยายในเครื่องหมายคำพูดคู่และเครื่องหมายคำพูดแยกxจากการขยายตัวแปรเพื่อให้เชลล์ทำสิ่งที่ถูกต้อง

ฉันใช้FOOตัวแปรสภาพแวดล้อมที่นี่เพื่อความชัดเจน ทุกสิ่งที่ฉันเขียนด้านบนใช้เช่นเดียวกับPATHเพราะมันเป็นเพียงตัวแปรสภาพแวดล้อมอื่น ข้อความตัวอย่างจะยาวขึ้นมาก

เส้นทางการส่งออกหมายถึงอะไร เราจะส่งออกเมื่อใด

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

$ echo $FOO
bar
$ bash
$ echo $FOO

$ exit
$ export FOO
$ bash
$ echo $FOO
bar

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

คุณใช้exportเมื่อคุณต้องการให้โปรแกรมย่อยเห็นค่าที่ตั้งไว้ในเชลล์และไม่ใช้เมื่อคุณไม่ต้องการให้เกิดขึ้น

โดยทั่วไปฉันไม่ส่งออกตัวแปรชั่วคราวในเชลล์สคริปต์เพราะฉันไม่ต้องการให้พวกเขาเปลี่ยนวิธีการทำงานของโปรแกรมจากเชลล์สคริปต์นั้น

ฉันจะไม่ตอบคำถามอื่นของคุณ คุณควรถามคำถามทีละครั้งเท่านั้น ฉันตอบแค่นี้เพราะพวกเขาเกี่ยวข้องกันอย่างคลุมเครือ ทุกอย่างอื่นอยู่ในคำถามที่แยกต่างหาก

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