ทำไมเชลล์แบบโต้ตอบบนเชลล์ล็อกอินของ OSX เป็นค่าเริ่มต้น


43

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

เมื่อเชลล์เชิงโต้ตอบที่ไม่ใช่เชลล์ล็อกอินเริ่มทำงาน bash จะอ่านและดำเนินการคำสั่งจาก/etc/bash.bashrcและ~/.bashrcถ้ามีไฟล์เหล่านี้อยู่ สิ่งนี้อาจถูกยับยั้งโดยใช้ --norc ตัวเลือก

--rcfile ตัวเลือกไฟล์จะบังคับทุบตีอ่านและรันคำสั่งจากไฟล์แทนและ/etc/bash.bashrc~/.bashrc

และสำหรับล็อกอินเชลล์:

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

--noprofileตัวเลือกที่อาจจะนำมาใช้เมื่อเปลือกจะเริ่มต้นในการยับยั้งการทำงานนี้

บน OSX อย่างไรก็ตามเชลล์เริ่มต้น (ซึ่งเป็น bash) เริ่มต้นในเทอร์มินัลเริ่มต้น (Terminal.app) จริง ๆ แล้วแหล่งที่มา~/.bash_profileหรือ~.profileอื่น ๆ กล่าวอีกนัยหนึ่งมันทำหน้าที่เหมือนเปลือกเข้าสู่ระบบ

คำถามหลัก : เหตุใดเชลล์การโต้ตอบเริ่มต้นคือเชลล์การเข้าสู่ระบบบน OSX เหตุใด OSX จึงเลือกทำเช่นนี้ ซึ่งหมายความว่าทุกคำแนะนำ / แบบฝึกหัดสำหรับสิ่งเปลือกตามที่กล่าวถึงการเปลี่ยนแปลงในสิ่งที่~/.bashrcจะล้มเหลวใน OSX ~/.profileหรือในทางกลับกันสำหรับ ถึงกระนั้นในขณะที่ข้อกล่าวหาจำนวนมากสามารถปรับระดับได้ที่ Apple การจ้าง devs ที่ไร้ความสามารถหรืองี่เง่าไม่ได้เป็นหนึ่งในนั้น สันนิษฐานว่าพวกเขามีเหตุผลที่ดีสำหรับเรื่องนี้ทำไม?

คำถามย่อย: Terminal.app ใช้งานเชลล์ล็อกอินแบบโต้ตอบหรือไม่หรือพวกเขาเปลี่ยนพฤติกรรมของ bash หรือไม่? สิ่งนี้เฉพาะเจาะจงกับ Terminal.app หรือเป็นอิสระจากเทอร์มินัลอีมูเลเตอร์หรือไม่?


2
Terminal.app รันเชลล์ล็อกอิน ฉันไม่รู้ว่าทำไม Apple เลือกที่จะทำเช่นนั้น
Gilles 'หยุดความชั่วร้าย'

โดยวิธีการที่เป็นของMacOS Catalinaที่เปลือกเริ่มต้นคือ zsh
Basil Bourque

คำตอบ:


33

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

เหตุผลที่เทอร์มินัลอีมูเลเตอร์บน Linux (และระบบ X-based อื่น ๆ ) ไม่จำเป็นต้องเรียกใช้.profileตัวเองเพราะปกติแล้วมันจะถูกรันแล้วเมื่อคุณล็อกอินเข้าสู่ X การตั้งค่า.profileที่ควรจะเป็นแบบที่สามารถ สืบทอดโดยกระบวนการย่อยดังนั้นตราบใดที่มีการดำเนินการเพียงครั้งเดียวเมื่อคุณลงชื่อเข้าใช้ (เช่นผ่าน.Xsession), subshells เพิ่มเติมใด ๆ ไม่จำเป็นต้องเรียกใช้อีกครั้ง

ตามที่หน้า Debian wikiเชื่อมโยงโดย Alan Shutko อธิบาย:

"ทำไมต้อง.bashrcแยกไฟล์ออกจาก.bash_profileกันนี่คือเหตุผลส่วนใหญ่ในอดีตเมื่อเครื่องจักรช้ามากเมื่อเทียบกับเวิร์กสเตชันในปัจจุบันการประมวลผลคำสั่งใน.profileหรือ.bash_profileอาจใช้เวลาค่อนข้างนานโดยเฉพาะอย่างยิ่งในเครื่องที่ใช้งานมาก จะต้องทำโดยคำสั่งภายนอก (pre-bash) ดังนั้นคำสั่งตั้งค่าเริ่มต้นที่ยากซึ่งสร้างตัวแปรสภาพแวดล้อมที่สามารถส่งผ่านไปยังกระบวนการลูกได้ถูกใส่เข้าไป.bash_profileการตั้งค่าชั่วคราวและนามแฝงที่ไม่ได้รับการถ่ายทอด ใน.bashrcเพื่อให้พวกเขาสามารถ re-อ่านโดยทุก subshell."

กฎเดียวกันทั้งหมดยังคงใช้ OSX อยู่เช่นกันยกเว้นสิ่งหนึ่ง - OSX GUI ไม่ทำงาน.profileเมื่อคุณลงชื่อเข้าใช้เนื่องจากมีวิธีการโหลดการตั้งค่าทั่วโลก แต่นั่นหมายความว่าจำลอง terminal ใน OSX ไม่จำเป็นต้องเรียกใช้.profile(โดยบอกเปลือกมันเปิดตัวว่ามันเป็นเปลือกเข้าสู่ระบบ) มิฉะนั้นคุณจะจบลงด้วยเปลือกอาจพิการ


ตอนนี้ความแปลกประหลาดของ bash ที่ไม่ได้แชร์โดยเชลล์อื่น ๆ ส่วนใหญ่คือมันจะไม่ทำงานโดยอัตโนมัติ.bashrcหากมันเริ่มต้นเป็นเชลล์ล็อกอิน มาตรฐานการแก้ไขปัญหาสำหรับสิ่งนี้คือการรวมบางสิ่งเช่นคำสั่งต่อไปนี้ไว้ใน.bash_profile:

[[ -e ~/.profile ]] && source ~/.profile    # load generic profile settings
[[ -e ~/.bashrc  ]] && source ~/.bashrc     # load aliases etc.

หรืออาจเป็นไปได้ที่จะไม่มี.bash_profileเลยและรวมรหัสเฉพาะ bash บาง.profileไฟล์ไว้ในไฟล์ทั่วไปเพื่อให้ทำงาน.bashrcหากจำเป็น

หากค่าเริ่มต้นของ OSX .bash_profileหรือ.profile ไม่ทำเช่นนี้แสดงว่าเป็นข้อบกพร่อง ในกรณีใด ๆ .bash_profileที่เหมาะสมทำงานรอบก็คือการเพิ่มบรรทัดเหล่านั้นไป


แก้ไข: ในฐานะที่เป็นบันทึก strugeeเปลือกเริ่มต้นใน OSX เคยเป็น tcsh, มีพฤติกรรมเป็น saner มากในแง่นี้เมื่อทำงานในฐานะที่เป็นเปลือกเข้าสู่ระบบแบบโต้ตอบ tcsh โดยอัตโนมัติอ่านทั้งสอง.profile และ .tcshrc / .cshrcและทำให้ไม่จำเป็นต้องใช้วิธีการแก้ปัญหาใด ๆ เช่น.bash_profileเคล็ดลับ แสดงไว้ด้านบน

จากสิ่งนี้ฉันมั่นใจ 99% ว่าความล้มเหลวของ OSX ในการจัดหาค่าเริ่มต้นที่เหมาะสม.bash_profileนั้นเป็นเพราะเมื่อพวกเขาเปลี่ยนจาก tcsh เป็น bash ผู้คนใน Apple ก็ไม่ได้สังเกตหูดเล็ก ๆ นี้ในพฤติกรรมการเริ่มต้นของ bash ด้วย tcsh ไม่จำเป็นต้องใช้กลอุบายใด ๆ เริ่มต้น tcsh เป็นเชลล์ล็อกอินจากโปรแกรมจำลองเทอร์มินัล OSX Just Plain Works และทำสิ่งที่ถูกต้องโดยไม่ต้อง kluges


1
ขอบคุณฉันรู้ทุกอย่าง คำถามของฉันคือเหตุใด OSX จึงเลือกที่จะตั้งค่าในลักษณะที่.bashrcไม่เกี่ยวข้อง? ทำไมพวกเขาเลือกที่จะทำให้เปลือกหอยเข้าสู่ระบบทั้งหมด? เท่าที่ฉันสามารถบอกได้เพียงประโยคสุดท้ายของคุณพูดถึงเรื่องนั้นและบอกเพียงว่ามันเป็นข้อผิดพลาด
terdon

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

2
ใช่และทั้งฉันและอลันอธิบายว่าเป็นเพราะไม่เหมือน Linux, OSX ไม่ทำงาน.profileเมื่อผู้ใช้ลงชื่อเข้าใช้ GUI ดังนั้นพวกเขาต้องดำเนินการในภายหลังเพื่อรับตัวแปรสภาพแวดล้อมเช่น$PATHซึ่งปกติตั้ง.profileค่าไว้อย่างถูกต้อง . ความจริงที่ว่าในฐานะที่เป็นผลข้างเคียงนี้ทำให้.bashrcไม่ต้องมาเป็นข้อผิดพลาด; คุณสามารถโต้เถียงเกี่ยวกับว่ามันเป็นข้อผิดพลาดในทุบตีหรือใน OSX แต่นั่นไม่ได้เปลี่ยนความจริงที่ว่าพฤติกรรมที่ถูกต้องจะตรวจสอบให้แน่ใจว่าทั้งสองตัวแปรสภาพแวดล้อมจาก.profileและการตั้งค่า bash config จาก.bashrcโหลด
Ilmari Karonen

1
การมี.bashrcแหล่งที่มา.profileจะเป็นความคิดที่ไม่ดีเนื่องจากจะทำให้ทุก subshell เรียกใช้.profileซ้ำ หากไม่มีอะไรอื่นนี้จะทำให้เกิดการร่วมกัน.profileสำนวนเช่นexport PATH = "$HOME/bin:$PATH"เพื่อให้ prepending $PATHรายการซ้ำซ้อนไป มี.profileแหล่งที่มา.bashrcทำให้รู้สึกมากขึ้น แต่หลังจากตรวจสอบว่าเปลือกมันทำงานอยู่ในความเป็นจริงทุบตี มี.bash_profileแหล่งที่มาทั้งสอง.profile และ .bashrcตามที่ฉันแนะนำข้างต้นคือ IMO ตัวเลือกที่เหมาะสมที่สุด
Ilmari Karonen

2
และฉันกำลังพูดคำตอบ "ทำไมพวกเขาใช้เปลือกเข้าสู่ระบบ?" คือ "เพราะพวกเขาต้องโหลด.profile" ในขณะที่คำตอบของ "ทำไมพวกเขาไม่ได้มา.bashrcจาก.profileนั้น" คือ"เพราะมันเป็นข้อผิดพลาด!" อย่างจริงจังที่ไม่อาจเป็นการตัดสินใจโดยเจตนา มันเป็นเพียงสิ่งที่พวกเขามองข้ามอาจเป็นเพราะในระบบนิเวศ Mac เชลล์เป็นพลเมืองชั้นสองที่ผู้ใช้ส่วนใหญ่ไม่ควรจัดการ (สดุดีดูที่คำตอบของผู้ลี้ภัยสำหรับคำอธิบายทางประวัติศาสตร์มันเกือบจะแน่นอนว่าการถดถอยจากการเปลี่ยนจาก tcsh เป็น bash)
Ilmari Karonen

14

เหตุผลหลักที่แอปพลิเคชัน X terminal รันเชลล์ที่ไม่ใช่การเข้าสู่ระบบโดยค่าเริ่มต้นคือในช่วงแรกของคุณ. Xsession ของคุณจะรัน. profile เพื่อตั้งค่ารายการเข้าสู่ระบบเริ่มต้นของคุณ จากนั้นเนื่องจากมีการตั้งค่าทั้งหมดแล้วแอปเทอร์มินัลจึงไม่จำเป็นต้องเรียกใช้จึงสามารถเรียกใช้. bashrc การอภิปรายว่าทำไมเรื่องนี้ถึงสำคัญคือhttps://wiki.debian.org/DotFiles :

ลองมา xdm เป็นตัวอย่าง pierre กลับมาจากวันหยุดพักผ่อนในวันหนึ่งและพบว่าผู้ดูแลระบบของเขาติดตั้ง xdm บนระบบ Debian เขาเข้าสู่ระบบได้ดีและ xdm อ่านไฟล์. xsession ของเขาและเรียกใช้ fluxbox ทุกอย่างดูเหมือนจะโอเคจนกว่าเขาจะได้รับข้อความแสดงข้อผิดพลาดในสถานที่ที่ไม่ถูกต้อง! เนื่องจากเขาแทนที่ตัวแปร LANG ใน. bash_profile ของเขาและเนื่องจาก xdm ไม่เคยอ่าน. bash_profile ตัวแปร LANG ของเขาจึงถูกตั้งค่าเป็น en_US แทนที่จะเป็น fr_CA

ตอนนี้โซลูชันไร้เดียงสาของปัญหานี้คือแทนที่จะเปิดตัว "xterm" เขาสามารถกำหนดค่าตัวจัดการหน้าต่างของเขาเพื่อเปิดตัว "xterm -ls" แฟล็กนี้บอก xterm ว่าแทนที่จะเรียกใช้เชลล์ปกติควรเปิดใช้เชลล์ล็อกอิน ภายใต้การตั้งค่านี้ xterm spawns / bin / bash แต่มันใส่ "- / bin / bash" (หรืออาจจะ "-bash") ในอาร์กิวเมนต์เวกเตอร์ดังนั้น bash จึงทำหน้าที่เหมือนเชลล์ล็อกอิน ซึ่งหมายความว่าทุกครั้งที่เขาเปิด xterm ใหม่มันจะอ่าน / etc / profile และ. bash_profile (พฤติกรรมทุบตีในตัว) จากนั้น. bashrc (เพราะ. bash_profile บอกว่าจะทำเช่นนั้น) นี่อาจดูเหมือนจะทำงานได้ดีในตอนแรก - ไฟล์ dot ของเขาไม่หนักดังนั้นเขาจึงไม่แม้แต่สังเกตเห็นความล่าช้า - แต่ก็มีปัญหาที่ลึกซึ้งยิ่งขึ้น เขายังเปิดตัวเว็บเบราว์เซอร์โดยตรงจากเมนู fluxbox ของเขา และเว็บเบราว์เซอร์สืบทอดตัวแปร LANG จาก fluxbox ซึ่งตอนนี้ถูกตั้งค่าเป็นภาษาที่ไม่ถูกต้อง ดังนั้นในขณะที่ xterms ของเขาอาจใช้ได้และสิ่งใดก็ตามที่เปิดตัวจาก xterms ของเขาอาจใช้ได้เว็บเบราว์เซอร์ของเขายังคงให้เพจของเขาในสถานที่ที่ไม่ถูกต้อง

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

แล้ว. bashrc ล่ะ? มันไร้ประโยชน์หรือเปล่า? ไม่มันยังคงมีจุดประสงค์ที่มีในยุค VT100 มันถูกใช้ตลอดเวลาที่คุณเปิดเปลือกอื่น ๆ นอกเหนือจากการเปิดหน้าต่างเทอร์มินัล ดังนั้นถ้าคุณใช้ Emacs หรือ vi หรือคุณเป็นผู้ใช้ su


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

4

ฉันไม่รู้ว่าทำไมพวกเขาถึงทำอย่างนั้น อย่างไรก็ตามนี่คือการคาดเดาของฉัน

เริ่มต้นด้วยมันน่าสังเกตว่าในระบบ GNU / Linux คุณสามารถเปลี่ยนไปใช้ vt1, vt2 และอื่น ๆ ได้คุณจะได้เชลล์การล็อกอินที่นั่น บนระบบ OS X ไม่มีอะไรเทียบเท่า วิธีเดียวในการเข้าถึง UNIX underpinnings คือผ่านเทอร์มินัลอีมูเลเตอร์หรือผ่านโหมดผู้ใช้คนเดียว (ข้อจำกัดความรับผิดชอบ: ฉันไม่เคยใช้โหมดผู้ใช้คนเดียวจริง ๆ แล้วมันเป็น IIRC ขับเคลื่อนด้วย commandline แต่ฉันอาจผิด) ดังนั้นใน OS X ไม่ว่าค่าเริ่มต้นจะอยู่ในตัวจำลองจึงเป็นค่าเริ่มต้นสำหรับทั้งระบบ

ทีนี้ทำไมคุณถึงตั้งค่าเริ่มต้นให้เป็นเชลล์ล็อกอิน? มีเหตุผลอยู่สองสามข้อ (อ่าน: ไม่มาก)

  • มันให้ประสบการณ์ผู้ใช้ที่สอดคล้องกันถ้าคุณ SSH ลงในช่อง (สำคัญอย่างยิ่งสำหรับรุ่นเซิร์ฟเวอร์ของ OS X - สมมุติว่าคุณใช้เซิร์ฟเวอร์ OS X คุณเป็นมือใหม่)
  • เปลือกเริ่มต้นของ OS X tcshที่เคยเป็น นี่เป็นเรื่องที่เดาได้ยาก แต่โดยทั่วไปแล้วอาจtcshทำอะไรบางอย่างเมื่อเรียกใช้เป็นเชลล์ล็อกอินและรูปแบบประวัติติดอยู่ (ฉันสงสัยว่ามัน - บางทีหนึ่งในผู้อาวุโสประจำอาจบอกเราได้)
  • "เราคือ Apple เราเป็นผู้จำหน่าย UNIX ที่ใหญ่ที่สุดในโลกมันไม่สำคัญว่าเหตุผลของเราคืออะไรถ้าเราตัดสินใจเครื่องมือของคุณต้องจัดการกับมัน"

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

เพื่อตอบคำถามย่อยของคุณbashจะไม่ได้รับการแก้ไขหรืออะไร (อย่างน้อยก็สำหรับเรื่องนี้) เทอร์มินัลอีมูเลเตอร์เริ่มต้นรันเชลล์การเข้าสู่ระบบตามค่าเริ่มต้นและสันนิษฐานว่า iTerm คัดลอก


1
+1 สำหรับการกล่าวถึง tcsh เนื่องจากพฤติกรรมของมันนั้นอยู่ไกลในแง่นี้มากกว่าของการทุบตี: เมื่อเริ่มต้นเป็นเชลล์ล็อกอินแบบโต้ตอบแหล่งที่มา tcsh ทั้งสอง .profileและ.tcshrc/ .cshrcโดยไม่ต้อง kluges ใด ๆ เหมือนที่ฉันให้ไว้ในคำตอบของฉัน ระบุว่าฉันสงสัยว่าพฤติกรรมนี้เป็นการถดถอยที่ไม่เกิดจากสวิตช์จาก tcsh เป็น bash
Ilmari Karonen

@IlmariKaronen คุณหมายถึง (ที่นี่และที่นั่น ) ที่มา tcsh .loginและ.tcshrc/ .cshrc? มันจะทำให้รู้สึกสำหรับ tcsh จะไม่มีแหล่งที่มา.profile; มันมักจะมีคำสั่งที่มีshไวยากรณ์ที่tcshไม่ยอมรับ ฉันไม่มี macOS แต่ฉันสร้าง/bin/tcshเชลล์การเข้าสู่ระบบบน Ubuntu 16.04 .profileไม่มีที่มา tcsh (1)ไม่พูดถึงไฟล์นั้นและtcshนี้(1)ไม่
Eliah Kagan

3

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

คำถามนี้ถูกถามและตอบในปี 2014 ฉันได้ทำการวิจัยเรื่องนี้เพื่อสร้างชุด. bashrc & .bash_profile ทั่วไปเพื่อใช้งานกับ Linux distros และ BSD (สิ่งที่พวกเขาเรียกว่าพวกเขาไม่ใช่ distros)

ฉันเพิ่งซื้อ Mac Mini ที่ใช้แล้วและติดตั้ง Sierra แล้วตอนนี้ฉันมีระบบที่มี 10.6, 10.10, 10.11 และ 10.12 แม้ว่าฉันได้ munged คนที่มีอายุมากกว่า (ปล่อยเบาะแสไปยังสถานะก่อนหน้าของพวกเขา) การติดตั้ง 10.12 Sierra ไม่ได้ถูกแตะต้อง

ผลลัพธ์: ใน 10.12 Sierra ไม่มีการสร้าง. bashrc, .bash_profile หรือ. profile ที่เป็นค่าเริ่มต้น ใน / etc จะมี bashrc, bashrc_Apple_Terminal และโปรไฟล์ เนื้อหาของ / etc / profile:

# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

เนื้อหาของ / etc / bashrc:

# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
   return
fi

PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"

สคริปต์ / etc / bashrc_Apple_Terminal ตั้งค่าตัวแปร PROMPT_COMMAND และตั้งค่ากลไกสำหรับการรักษาสถานะเซสชันสำหรับแต่ละเทอร์มินัล หากแอปเทอร์มินัลถูกปิดสถานะของเซสชันก่อนหน้าจะถูกกู้คืนเมื่อแอปเริ่มต้นอีกครั้ง มิฉะนั้นจะไม่มีการตั้งค่าอะไรเลย (ขั้นต่ำ $ PS1 ขั้นต่ำ) ใน / etc / bashrc โดยปล่อยให้การปรับแต่งอื่น ๆ (จริง ๆ $ PS1, aliases, function) ตั้งเป็น ~ / .bashrc และ $ PATH ใน. bash_profile (หรือใน. profile มาจาก. bash_profile)

ฉันยืนยันว่า iTerm2 ทำงานในลักษณะเดียวกับแอป Terminal ยกเว้นว่าพฤติกรรมเริ่มต้นของการเริ่มเซสชันการเข้าสู่ระบบจะสามารถมองเห็นได้และสามารถแก้ไขได้

หากคุณเรียกใช้เซสชันเทอร์มินัล X11 (ตอนนี้ XQuartz) XTerm คุณจะเห็นเซสชันที่ไม่ใช่การเข้าสู่ระบบเหมือนกับในระบบ Linux .bash_profile (หรือ. profile) ถูกข้ามไปและคุณเพิ่งได้รับ. bashrc

และนี่คือคำตอบของฉัน:

แม้ว่าแอป Terminal จะอ้างว่าเป็น xterm (TERM = xterm-256color) แต่ก็ไม่ได้ตั้งค่าตัวแปร $ DISPLAY ยกเว้นว่าได้ติดตั้ง X11 ไว้ เราเห็นการจำลองสภาพแวดล้อม X แต่ไม่ใช่ของจริงอย่างสมบูรณ์ หากคุณ SSH เข้าสู่ระบบอื่นที่มีสวิตช์ -X (เปิดใช้งานการส่งต่อ X11) จะล้มเหลวเนื่องจากไม่มีตัวแปร $ DISPLAY หากคุณติดตั้ง X11 ดังนั้น SSH ในระบบอื่นการส่งต่อ X11 จะสำเร็จ

Bottom line (และคำตอบสั้น ๆ ): แอป Terminal ไม่ใช่ขั้ว X11 ที่แท้จริง (ไม่ได้ตั้งค่า $ DISPLAY); มันทำหน้าที่เหมือนการล็อกอิน SSH มากกว่าเซสชัน XTerm ซึ่งจะต้องเป็นเซสชันการเข้าสู่ระบบเพื่อตั้งค่าจาก / etc / profile และ ~ / .bash_profile หรือ ~ / .profile


0

คำตอบข้างต้นอธิบายเหตุผลว่าทำไมเปลือกหอยเปลือกหอยโต้ตอบเข้าสู่ระบบใน MacOS โดยค่าเริ่มต้น: การตั้งค่าใน/etc/profile, ~/.profileได้รับมาจากเปลือกที่ไม่ได้เข้าสู่ระบบในระบบ X-based แต่ไม่ได้อยู่ใน MacOS ที่นี่ฉันอยากเตือนคุณว่าคุณควรใช้ login shell บน macOSเพราะมีpath_helper:

 cat /etc/profile # or cat /etc/zprofile
# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

path_helperยูทิลิตี้อ่านเนื้อหาของไฟล์ในไดเรกทอรี/etc/paths.dและ/etc/manpaths.d และผนวกเนื้อหาของพวกเขาไปPATHและMANPATHสภาพแวดล้อมตัวแปรตามลำดับ ( MANPATHตัวแปรสภาพแวดล้อมจะไม่ได้รับการแก้ไขเว้นแต่จะถูกตั้งค่าไว้ในสภาพแวดล้อมแล้ว)

หากคุณใช้เชลล์ที่ไม่ใช่การเข้าสู่ระบบบางพา ธ จะไม่ถูกนำเข้า

ฉันคิดว่ามันเป็นความคิดที่ดีสำหรับนักพัฒนาที่จะนำไฟล์ไป/etc/paths.dที่จะนำเข้าค่าเส้นทางของพวกเขา แต่ไม่ให้ symlink ไบนารี callable เข้าไปในสถานที่เช่นหรือ/usr/bin /bin(ค่าเริ่มต้นPATHคือ/usr/bin:/bin:/usr/sbin:/sbinไม่ใช่ทุกคนที่ใช้ Homebrew หรือ MacPort เพื่อเพิ่มค่าที่กำหนดเองPATHดังนั้นจึงไม่มีสถานที่ที่ปลอดภัยที่จะใส่ symlink ของคำสั่ง callable)

/etc/paths.dนี่คือตัวอย่างของไฟล์ใน โดยพื้นฐานแล้วคุณจะใส่หนึ่งค่าในแต่ละบรรทัด

 cat /etc/paths.d/Wireshark
/Applications/Wireshark.app/Contents/MacOS

อ้างอิง:

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