ทำไม Bash ต้นทางระยะไกล. Bash_profile แทนที่จะเป็น. bashrc


24

คู่มือทุบตีพูดว่า:

Bash พยายามที่จะกำหนดว่าเมื่อใดที่มันถูกรันด้วยอินพุตมาตรฐานที่เชื่อมต่อกับการเชื่อมต่อเครือข่ายเช่นเดียวกับเมื่อดำเนินการโดย remote shell daemon โดยปกติคือ rshd หรือ secure shell daemon sshd หาก Bash ระบุว่ากำลังรันในโหมดนี้มันจะอ่านและดำเนินการคำสั่งจาก ~ / .bashrc หากไฟล์นั้นมีอยู่และอ่านได้

แหล่งข้อมูล Bash นี้~/.bashrc:

ssh user@host :

แต่แหล่ง Bash นี้~/.bash_profile:

ssh user@host

ฉันไม่เห็นความแตกต่างในสองคำสั่งนี้ตามข้อกำหนด ทั้งสองกรณีไม่ได้เชื่อมต่อ stdin กับการเชื่อมต่อเครือข่ายหรือไม่


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

คำตอบ:


44

เปลือกเข้าสู่ระบบแรกอ่านแล้ว/etc/profile~/.bash_profile

เปลือกที่ไม่ได้เข้าสู่ระบบอ่านจากแล้ว/etc/bash.bashrc~/.bashrc

เหตุใดจึงสำคัญ

เนื่องจากบรรทัดนี้ในman ssh:

หากระบุคำสั่งคำสั่งจะถูกดำเนินการบนรีโมตโฮสต์แทนที่จะเป็นเชลล์ล็อกอิน

กล่าวอีกนัยหนึ่งหากคำสั่ง ssh มีเพียงตัวเลือก (ไม่ใช่คำสั่ง) เช่น:

ssh user@host

~/.bash_profileมันก็จะเริ่มเข้าสู่ระบบเปลือกเป็นเปลือกเข้าสู่ระบบอ่าน

คำสั่ง ssh ซึ่งไม่มีคำสั่งเช่น:

ssh user@host :

คำสั่งอยู่ที่ไหน:(หรือไม่ทำอะไรเลย)
มันจะไม่เริ่มเชลล์การเข้าสู่ระบบดังนั้นจึง~/.bashrcเป็นสิ่งที่จะอ่าน


รีโมต stdin

การเชื่อมต่อ tty ที่ให้มาสำหรับ / dev / stdin ในคอมพิวเตอร์ระยะไกลอาจเป็น tty จริงหรืออย่างอื่น

สำหรับ:

$ ssh sorontar@localhost
/etc/profile sourced

$ ls -la /dev/stdin
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0

$ ls -la /proc/self/fd/0
lrwx------ 1 sorontar sorontar 64 Dec 24 19:34 /proc/self/fd/0 -> /dev/pts/3

$ ls -la /dev/pts/3
crw--w---- 1 sorontar tty 136, 3 Dec 24 19:35 /dev/pts/3

ซึ่งลงท้ายด้วย TTY (ไม่ใช่การเชื่อมต่อเครือข่าย) เมื่อ bash เริ่มต้นเห็น

สำหรับการเชื่อมต่อ ssh ด้วยคำสั่ง:

$ ssh sorontar@localhost 'ls -la /dev/stdin'
sorontar@localhost's password: 
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0

รายการของ TTY เริ่มต้นเหมือนกัน แต่โปรดทราบว่า / etc / profile ไม่ได้มีที่มา

$ ssh sorontar@localhost 'ls -la /proc/self/fd/0'
sorontar@localhost's password:
lr-x------ 1 sorontar sorontar 64 Dec 24 19:39 /proc/self/fd/0 -> pipe:[6579259]

ซึ่งบอกเชลล์ว่าการเชื่อมต่อเป็นไพพ์ (ไม่ใช่การเชื่อมต่อเครือข่าย)

ดังนั้นในทั้งสองกรณีทดสอบเชลล์ไม่สามารถรู้ได้ว่าการเชื่อมต่อมาจากเครือข่ายและดังนั้นจึงไม่อ่าน~/.bashrc(ถ้าเราพูดถึงการเชื่อมต่อกับเครือข่ายเท่านั้น) มันอ่าน ~ / .bashrc แต่ด้วยเหตุผลอื่น


กรณีที่ไม่มีข้อโต้แย้งจะไม่มีคุณสมบัติที่จะทำงานด้วยอินพุตมาตรฐานที่เชื่อมต่อกับการเชื่อมต่อเครือข่ายและ~/.bashrcอ่านได้หรือไม่
Cyker

@Cyker นั่นคือสมมติว่าเปลือกจะมีการเชื่อมต่อกับเครือข่ายstdin ทำไมคุณคิดเช่นนั้น? (คำตอบแก้ไขโปรดอ่าน)
sorontar

ส่วนที่แก้ไขคือสิ่งที่น่าสนใจ ดูเหมือนว่า ssh ไม่ได้ใส่ใจกับ pty เพียงแค่ดำเนินการคำสั่ง
Cyker

8

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


เหตุผลที่มีไฟล์เริ่มต้นสองไฟล์ ("โปรไฟล์" และ "rc") คือในอดีตวิธีทั่วไปในการทำงานกับเครื่องคือ:

  1. เข้าสู่ระบบจากชนิดของขั้วจริงหรือเวิร์กสเตชันอื่น ๆ และบางส่วนได้รับเปลือกเข้าสู่ระบบ เชลล์นี้จะเรียกใช้/etc/profileและ~/.profileตั้งค่าสภาพแวดล้อมสำหรับผู้ใช้

  2. เรียกใช้สภาพแวดล้อมที่ผู้ใช้ต้องการป้อน สภาพแวดล้อมนี้อาจเป็น Xorg แต่ในกรณีส่วนใหญ่มันเป็นมัลติเพล็กเซอร์เช่นหน้าจอ GNU

  3. จากนั้นสภาพแวดล้อม (เช่นหน้าจอ GNU) จะเรียกใช้เชลล์พิเศษ (ที่ไม่ได้ลงชื่อเข้าใช้) ซึ่งสืบทอดสภาพแวดล้อมจากเชลล์ล็อกอินหลัก

นั่นเป็นวิธีการทั่วไปในการเข้าสู่ระบบกับเครื่อง UNIX ในช่วงเวลาที่cshและbashได้รับการพัฒนา ดังนั้นจึงถือว่าสิ้นเปลืองที่จะอ่าน~/.profileอีกครั้งในเปลือกหอยที่สืบทอดสภาพแวดล้อมอยู่ดี

bashจากนั้นเพิ่ม~/.bashrcสำหรับการกำหนดค่าเพิ่มเติมสำหรับเชลล์ที่ไม่ใช่การเข้าสู่ระบบเหล่านี้ csh(และtcsh) ไม่เคยเพิ่มไฟล์ "rc" ชนิดใด ๆ สำหรับหอยที่ไม่ใช่การเข้าสู่ระบบ โปรดทราบว่าcsh/ tcshไม่ใช่เชลล์ที่เข้ากันได้กับเชลล์ bourne (ซึ่งเป็นส่วนหนึ่งของ POSIX) ในขณะที่bashเป็น อีกเปลือกเข้ากันได้บอร์นkshเพิ่มตัวแปรสภาพแวดล้อม (เรียกENV) ซึ่งหากได้รับการกำหนดไว้จะถูกนำมาใช้เป็นไฟล์คำสั่ง run ( "RC") kshสำหรับการไม่เข้าสู่ระบบ

ดังนั้นใช่, bourne shells รุ่นใหม่จะเพิ่มไฟล์การตั้งค่าพิเศษเพื่อความสะดวกในการใช้นามแฝงและตัวเลือกอย่างรวดเร็วอื่น ๆ ที่จะปรากฎอยู่ภายในเชลล์ที่ muxed โดยหน้าจอ GNU (หรือคล้ายกัน) แต่ไม่มีอยู่ในเชลล์ที่คุณได้รับเมื่อคุณป้อน เครื่อง

ด้วยการเพิ่มตัวจัดการการแสดงผลกราฟิก (GDM) ความแตกต่างระหว่างไฟล์ "โปรไฟล์" และไฟล์ "rc" กลายเป็นความหมายเพราะ GDM จะมีไฟล์เริ่มต้นของตัวเอง (เช่น~/.xinitและ~/.xsession) จากนั้นเชลล์ที่ระบุจากภายใน GDM อาจเป็นเชลล์การเข้าสู่ระบบหรือไม่ใช่การล็อกอินขึ้นอยู่กับการแปรเปลี่ยนของผู้ใช้และกรณีที่เชลล์ที่ไม่ใช่การล็อกอินจะมีพาเรนต์ที่เป็นเชลล์การเข้าสู่ระบบไม่เป็นความจริงอีกต่อไป

พิเศษ

หนึ่งในตารางที่ฉันชอบเกี่ยวกับการเปรียบเทียบไฟล์เริ่มต้นของเชลล์แสดงให้เห็นว่าเชลล์ที่เข้ากันได้ของเชลล์ bourne ใช้profileไฟล์อย่างไรในขณะที่เชลล์อื่นไม่รองรับ นี่เป็นเพราะในอดีตเชลล์เริ่มต้น (อันที่เริ่มต้น muxer) จำเป็นต้องเป็นเชลล์ที่เข้ากันได้กับ bourne

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