ทำไมแหล่งเริ่มต้น ~ / .profile ของ Ubuntu ถึง / /bashrc


30

นี่คือเนื้อหาของหุ้น~/.profileที่มาพร้อมกับ 13.10 ของฉัน (ลบบรรทัดที่มีความคิดเห็น):

if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

สิ่งนี้สืบทอดมาจาก Debian แต่ทำไม Canonical จึงตัดสินใจเก็บไว้ เท่าที่ฉันรู้มันไม่ใช่วิธีมาตรฐาน * และฉันได้เห็นระบบต่าง ๆ ที่สิ่งนี้ไม่ได้เกิดขึ้นดังนั้นฉันคิดว่าพวกเขาต้องมีเหตุผลที่ดี สิ่งนี้อาจทำให้เกิดพฤติกรรมที่ไม่คาดคิดเมื่อใช้งานเชลล์ล็อกอิน (เช่นเมื่อ sshing เข้าสู่เครื่องเป็นต้น) ซึ่งผู้ใช้ไม่คาดว่าจะได้รับ~/.bashrcแหล่งที่มา

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

เหตุใด Ubuntu จึงทำเช่นนี้ฉันจะทำยังไง


ทำไมจะ-n "$BASH_VERSION"เป็นจริงนอกทุบตี?
Elliott Frisch

@ElliottFrisch มันจะไม่เป็นเช่นนั้น คำถามของฉันคือทำไม.profileแหล่งที่มา.bashrcซึ่งไม่ได้เกิดขึ้นในทุกรุ่นของ Linux และฉันสงสัยว่าอะไรคือเหตุผลเบื้องหลัง
terdon

ดูเหมือนว่าจะนำไปใช้ในเดเบียนต้นน้ำ
Elliott Frisch

@ElliottFrisch ใช่ฉันคิดว่ามันไม่ได้และค้นหาและเห็นว่ามันเป็นเวลาที่จะแก้ไขความคิดเห็นของฉัน อย่างไรก็ตามมันไม่ใช่กรณีของระบบ SuSe ที่ฉันสามารถเข้าถึงได้ (แม้ว่าจะอยู่ในระบบ CentOS) และไม่ใช่ในระบบต่าง ๆ (RHs, Fedoras, Ubuntus รุ่นเก่า) เท่าที่ฉันจำได้ ดังนั้นฉันสงสัยว่าทำไม
terdon

คำตอบ:


15

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

ลองมา 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 ของเขาอาจใช้ได้เว็บเบราว์เซอร์ของเขายังคงให้เพจของเขาในสถานที่ที่ไม่ถูกต้อง

ดังนั้นทางออกที่ดีที่สุดสำหรับปัญหานี้คืออะไร มีไม่สากลอย่างแท้จริง วิธีที่ดีกว่าคือการแก้ไขไฟล์. xsession เพื่อให้มีลักษณะดังนี้:

[ -r /etc/profile ] && source /etc/profile
[ -r ~/.bash_profile ] && source ~/.bash_profile
xmodmap -e 'keysym Super_R = Multi_key'
xterm &
exec fluxbox

สิ่งนี้ทำให้เชลล์ที่ตีความสคริปต์. xsession อ่านใน / etc / profile และ. bash_profile หากมีอยู่และอ่านได้ก่อนเรียกใช้ xmodmap หรือ xterm หรือ "execing" ตัวจัดการหน้าต่าง อย่างไรก็ตามมีข้อเสียเปรียบประการหนึ่งสำหรับวิธีนี้: ภายใต้ xdm, เชลล์ที่อ่าน. xsession ทำงานโดยไม่มีเทอร์มินัลการควบคุม หาก / etc / profile หรือ. bash_profile ใช้คำสั่งใด ๆ ที่ถือว่ามีเทอร์มินัล (เช่น "fortune" หรือ "stty") คำสั่งเหล่านั้นอาจล้มเหลว นี่คือเหตุผลหลักว่าทำไม xdm ไม่อ่านไฟล์เหล่านั้นตามค่าเริ่มต้น หากคุณจะใช้วิธีการนี้คุณต้องตรวจสอบให้แน่ใจว่าคำสั่งทั้งหมดใน "ไฟล์ dot" ของคุณปลอดภัยในการทำงานเมื่อไม่มีเทอร์มินัล


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

2

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

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

เพื่อรับนามแฝงที่ผู้ใช้กำหนดในสภาพแวดล้อมเชลล์ปัจจุบัน

นี่เป็นสิ่งสำคัญเพื่อมอบประสบการณ์ผู้ใช้ที่ดีเช่นกัน ยกตัวอย่างเช่นใครสามารถเก็บไว้ในหนังสือรับรองพร็อกซี่.bashrcเว้นแต่จะได้รับมาไม่มีการใช้งานมินัล ( ได้แก่ , ping, wget, curl, lynxฯลฯ ) จะทำงานอย่างถูกต้อง หรือคุณต้องระบุหนังสือรับรองพร็อกซีทุกครั้งที่คุณเปิดเทอร์มินัล

นอกจากการตั้งค่าเริ่มต้นของ Ubuntu แล้วยัง.bashrcมีนามแฝงที่เป็นมิตรกับผู้ใช้จำนวนมาก (สำหรับlsและgrepเพื่อพิมพ์เอาต์พุต colourized) คำจำกัดความใหม่มากมายสำหรับตัวแปรเชลล์ที่แตกต่างกันซึ่งช่วยเพิ่มประสบการณ์ผู้ใช้

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

กรณีที่ควรหลีกเลี่ยง

  • คุณไม่ควรจะมา~/.profileภายในรูปแบบ~/.bashrcในเวลาเดียวกันเมื่อถูกที่มาจาก~/.bashrc ~/.profileมันจะสร้างวง จำกัด ของสถานการณ์และเป็นผลให้สถานีรวดเร็วของคุณจะถูกระงับจนกว่าคุณจะตี+Ctrl Cในสถานการณ์เช่นนี้ถ้าคุณใส่สายใน~/.bashrc
ชุด -x

จากนั้นคุณจะเห็นว่าไฟล์ descriptor หยุดลงเมื่อคุณเปิดเทอร์มินัล


ขอบคุณนี่คือข้อมูลที่เป็นประโยชน์และเป็นจริงทั้งหมด มันไม่ได้ตอบคำถามของฉัน ฉันคุ้นเคยกับความแตกต่างระหว่างล็อกอินและเชลล์ที่ไม่ใช่การล็อกอิน คำถามของฉันทำไมในระบบอูบุนตูจะ.profileจัดหา.bashrc? SuSe Enterprise 10 ไม่ได้ทำไม่ได้ทำ Fedora เวอร์ชั่นใด ๆ ที่ฉันเคยใช้ แต่เมื่อหลายปีก่อนฉันอาจจะผิด CentOS 5.8 มีความผิดปกติพอสมควร อย่างไรก็ตามคุณเห็นจุดของฉัน นี่คือตัวเลือกการออกแบบและฉันสงสัยว่าทำไมมันถูกสร้างขึ้นมา
terdon

ฉันไม่ได้ใช้งานลีนุกซ์อื่น ๆ ที่คุณตั้งชื่ออย่างจริงจัง คุณสามารถบอกฉันว่าพวกเขาจัดการกับสถานการณ์เช่นคำสั่ง aliased ในเซสชั่น SSH ที่กำหนดไว้ในหรือ.bashrc .bash_aliasesเช่นฉันมีนามแฝงสำหรับlsเป็นls --color=autoในของฉัน.bashrcและฉันได้มาจากฉัน.bashrc .profileที่นี่ฉันสามารถใช้นามแฝงได้จาก ssh หรือฉันสามารถใช้ proxy ในเซสชัน ssh หากฉันไม่ได้มา.bashrcจาก.profileคุณสมบัติของฉัน ฉันคิดว่ามันเป็นประสบการณ์การใช้งานที่ดีขึ้นเกี่ยวกับ
souravc

พวกเขาทำไม่ได้นามแฝงเหล่านั้นจะไม่ทำงาน และใช่แล้วการจัดหาการ.bashrcแก้ไขนั้น แต่มันก็ทำให้เกิดปัญหาฉันจำได้ครั้งแรกที่ฉันใช้ระบบที่มีพฤติกรรมนี้ฉันยังคงได้รับข้อความแปลก ๆ เหล่านี้เมื่อsshมันทำให้ฉันใช้xset b offใน.bashrcที่ใช้ปิดการใช้งานกระดิ่งเทอร์มินัล แต่ในระบบ X เท่านั้น กำลังให้ข้อความแสดงข้อผิดพลาด เอาอายุฉันมาคิดดูว่าเกิดอะไรขึ้นเนื่องจากฉันไม่คิดว่า.bashrcจะอ่านเมื่อใช้เชลล์ล็อกอิน ฉันแค่สงสัยว่ามีคำสั่ง "อย่างเป็นทางการ" เกี่ยวกับเรื่องนี้
terdon

ฉันเห็นด้วยกับคุณ. ฉันยังต้องเผชิญกับปัญหาบางอย่างก่อนหน้านี้ แต่ส่วนใหญ่จะเป็นประโยชน์และเป็นมิตรกับผู้ใช้ถ้าคุณจำและหลีกเลี่ยงกรณีพิเศษบางอย่าง ไม่ใช่ :)
souravc

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