สคริปต์ใน /etc/profile.d ทำอะไรได้บ้าง


85

ฉันกำลังอ่านเกี่ยวกับการเขียนสคริปต์เปลือกพื้นฐานจากลินุกซ์บรรทัดคำสั่งและการเขียนสคริปต์เชลล์พระคัมภีร์

มันบอกว่า/etc/profileไฟล์ตั้งค่าตัวแปรสภาพแวดล้อมเมื่อเริ่มต้นของ Bash เชลล์ /etc/profile.dไดเรกทอรีมีสคริปต์อื่น ๆ ที่มีไฟล์เริ่มต้นโปรแกรมเฉพาะซึ่งจะดำเนินการในเวลาเริ่มต้นโดยเปลือก

  • เหตุใดไฟล์เหล่านี้จึงไม่ได้เป็นส่วนหนึ่งของ/etc/profileหากไฟล์เหล่านี้มีความสำคัญต่อการเริ่มต้นของ Bash ด้วย

  • หากไฟล์เหล่านี้เป็นไฟล์เริ่มต้นเฉพาะแอปพลิเคชันไม่สำคัญต่อการเริ่มต้น Bash ดังนั้นทำไมไฟล์เหล่านี้ถึงเป็นส่วนหนึ่งของกระบวนการเริ่มต้น เหตุใดจึงไม่ทำงานเฉพาะเมื่อมีการใช้งานแอปพลิเคชันเฉพาะซึ่งมีการตั้งค่า

คำตอบ:


71

เหตุใดไฟล์เหล่านี้จึงไม่ได้เป็นส่วนหนึ่งของ / etc / profile หากไฟล์เหล่านี้มีความสำคัญต่อการเริ่มต้นของ Bash

ถ้าคุณหมายถึง "ทำไมพวกเขาถึงไม่รวมกันเป็นสคริปต์บทเดียวขนาดยักษ์" คำตอบคือ:

  1. เพราะนั่นจะเป็นฝันร้ายในการบำรุงรักษาสำหรับคนที่รับผิดชอบสคริปต์
  2. เนื่องจากการโหลดสคริปต์เป็นโมดูลอิสระทำให้ระบบทั้งหมดสามารถปรับได้แบบไดนามิกมากขึ้น - แต่ละสคริปต์สามารถเพิ่มและลบออกได้โดยไม่กระทบต่อผู้อื่น เป็นต้น
  3. เพราะมันถูกโหลดผ่าน / etc / profile ซึ่งทำให้พวกเขาเป็นส่วนหนึ่งของ "โปรไฟล์" ทุบตีในวิธีเดียวกัน

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

ดูเหมือนว่าฉันชอบคำถามปรัชญาการออกแบบที่กว้างขึ้นที่ฉันจะแบ่งออกเป็นสอง คำถามแรกเกี่ยวกับคุณค่าและความเหมาะสมของการใช้สภาพแวดล้อมของเชลล์ มันมีค่าเป็นบวกหรือไม่? ใช่มันมีประโยชน์ มันเป็นทางออกที่ดีที่สุดสำหรับปัญหาการกำหนดค่าทั้งหมดหรือไม่ ไม่ แต่มีประสิทธิภาพมากสำหรับการจัดการพารามิเตอร์อย่างง่ายและยังเป็นที่รู้จักและเข้าใจอย่างกว้างขวาง ความแตกต่างที่จะพูดการตัดสินใจกำหนดค่าสิ่งต่าง ๆ บางที $ PATH อาจได้รับการจัดการโดยเครื่องมืออิสระแยกต่างหากเครื่องมือที่ต้องการเช่น $ EDITOR อาจอยู่ในไฟล์ sqlite ที่ไหนสักแห่ง $ LC lang สามารถอยู่ในไฟล์ข้อความที่มี รูปแบบที่กำหนดเองที่อื่น ฯลฯ - ไม่เพียง แต่ใช้ตัวแปร env และ/etc/profile.dทันใดนั้นดูเหมือนง่ายขึ้น? คุณอาจรู้อยู่แล้วว่าตัวแปร env คืออะไรมันทำงานอย่างไรและจะใช้อย่างไรกับการเรียนรู้ 5 กลไกที่แตกต่างกันอย่างสิ้นเชิงสำหรับ 5 ด้านที่แตกต่างกันอย่างแพร่หลายของสิ่งที่เรียกว่า "สภาพแวดล้อม" อย่างเหมาะสม

คำถามที่สองคือ "การเริ่มต้นเป็นเวลาที่เหมาะสมสำหรับสิ่งนี้หรือไม่" ซึ่งเป็นการคัดค้านว่ามันไม่ได้มีประสิทธิภาพมาก (ข้อมูลทั้งหมดที่อาจหรืออาจไม่ได้ใช้ ฯลฯ ) แต่:

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

สามารถเพิ่มมากขึ้นในรายการนั้นได้ แต่หวังว่าสิ่งนี้จะช่วยให้คุณมีความคิดเกี่ยวกับข้อดีข้อเสียของปัญหา - 'มืออาชีพ' ที่สำคัญและ 'นักโทษ' ที่สำคัญว่าเป็นเนมสเปซระดับโลก


Does it have positive ... and understood.คุณพยายามจะพูดอะไรที่นี่? ฉันเข้าใจทุกอย่างนอกเหนือจากวรรคนั้น
asheeshr

3
สภาพแวดล้อมของเชลล์โดยทั่วไปจะใช้สำหรับการกำหนดค่าเชลล์เองและเครื่องมือที่แพร่หลายอื่น ๆ นี้ไม่ได้เป็นเพียงวิธีการกำหนดค่าที่สามารถทำได้ดังนั้นจึงเป็นมูลค่าการพิจารณาไม่ว่าจะเป็นสภาพแวดล้อมที่ดีขึ้นหรือเลวร้ายยิ่งกว่าตัวเลือกอื่น ๆ การมี "ค่าบวก" ฉันหมายถึงการใช้สภาพแวดล้อมดูเหมือนจะมีข้อได้เปรียบเหนือตัวเลือกอื่นอย่างน้อย WRT "การจัดการพารามิเตอร์อย่างง่าย" - กล่าวคือมันมีประสิทธิภาพมากและ "เป็นที่รู้จักและเข้าใจ" ... และฉัน จะเพิ่มอีกเล็กน้อยเพื่ออธิบายวลีนั้นเพิ่มเติม
goldilocks

สิ่งที่เกี่ยวกับการต่อท้ายบรรทัดไปที่ profile.local? นี่เป็นสิ่งที่ยอมรับได้กับการสร้างสคริปต์ในโฟลเดอร์ profile.d หรือไม่?
Avindra Goolcharan

@AvindraGoolcharan distros ที่แตกต่างกันอาจใช้รูปแบบที่แตกต่างกันสำหรับสิ่งนี้ profile.dไดเรกทอรีทำงานเพียงเพราะเนื้อหาของมันมีที่มาจาก/etc/profileที่ระบุไว้โดยเปลือกเช่นทุบตีเป็นไฟล์เริ่มต้น (ดูภาวนาในman bash); หากคุณแก้ไขคุณสามารถปิดการใช้งาน /etc/profile ดูเหมือนจะเป็นสิ่งประดิษฐ์ SUSE ซึ่งมีที่มาจากที่อื่นเช่นคุณสามารถนำสิ่งของของคุณเองไปที่นั่น อย่างไรก็ตามหากคุณย้ายไปยังระบบที่ไม่ใช่ SUSE และไม่ทำการปรับเปลี่ยนอื่น ๆ ระบบจะไม่ใช้สิ่งใด /etc/profile.d/etc/profile.local/etc/profile
goldilocks

Gotcha นั่นแจ่มใส ใช่เราใช้ SUSE ในงานของฉัน / etc / รายละเอียด ดูเหมือนว่าจะเป็นเดิมพันที่ดีกว่ามาก
Avindra Goolcharan

13

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

นอกจากนี้ยังมีข้อความด้านข้าง/etc/profileที่มาจากเปลือกหอยทั้งหมดไม่ใช่แค่ทุบตี ไฟล์การกำหนดค่าเฉพาะของ bash นั้นเป็น bashrc และมีที่มาเฉพาะสำหรับเชลล์แบบโต้ตอบเท่านั้น


3
ย่อหน้าที่สองน่าสนใจ เนื่องจากเชลล์ที่แตกต่างกันสนับสนุนไวยากรณ์ที่แตกต่างกันสิ่งนี้จะต้องมีไวยากรณ์ที่สำคัญทั่วไป จริงสำหรับทุบตีและ sh แต่ฉันไม่คิดอย่างนั้นสำหรับคนอื่น ๆ เช่น csh หรือ tcsh ซึ่งมีสคริปต์เริ่มต้นเข้าสู่ระบบทั่วโลกของตัวเอง ในหลาย ๆ ระบบ / bin / sh เป็นเพียงลิงค์ไปยัง / bin / bash แต่ทุบตีปรับเปลี่ยนพฤติกรรมของมันให้เป็นไปตาม posix เมื่อเรียกว่า sh ดังนั้นใครจะคิดว่าผู้เขียนสคริปต์ใน /etc/profile.d จะต้องระมัดระวังเพื่อหลีกเลี่ยงการใช้ส่วนขยาย bash นอกชุดย่อย posix
sootsnoot

ภายใต้ linux จะมีไฟล์. csh และ. sh แยกต่างหากสำหรับเชลล์หลักสองชนิด
สิ้นเชิง

0

คำตอบของ jordanmไม่ถูกต้อง /etc/profileไม่ได้มาจากเปลือกหอยทั้งหมด ในขณะที่คุณชี้ให้เห็นก็ไม่ได้มาจากcsh, tcsh- zshฉันไม่แน่ใจเกี่ยวกับ มันมาจากบอร์นเชลล์ ( sh) อนุพันธ์เช่น Korn Shell ( ksh) และ BASH ( bash) การใช้งานcsh /etc/loginผู้ที่มีแนวโน้มที่จะใช้อนุพันธ์ Borne Shell โดยเฉพาะมีแนวโน้มที่จะลืมเชลล์อื่น ๆ พวกเขาเพิ่มสิ่งที่/etc/profileคาดหวังว่ามันจะนำไปใช้กับ "ผู้ใช้ทุกคน" แล้วจะประหลาดใจเมื่อผู้ใช้คี่ซีเชลล์ (และเราเป็นจำนวนมากคี่) /etc/profileไม่ได้มีสิ่งที่พวกเขากำหนดค่าใน

ถึงกระนั้นผู้คนก็มักจะลืมเกี่ยวกับเปลือกหอยชนิดอื่นที่มีอยู่ หากพวกเขาใช้bashหรือkshพวกเขารู้สึกอิสระที่จะเพิ่มไวยากรณ์ให้กับ/etc/profileที่ไม่ถูกต้องใน Bourne Shell เช่นพูดว่าการกำหนดตัวแปรและส่งออกมันในบรรทัดเดียวกัน จากนั้นคุณจะได้รับสคริปต์บางอย่างที่ทำ#!/bin/shและมันจะทำให้เกิดปัญหากับไวยากรณ์ /etc/profileควรติดกับไวยากรณ์ที่เข้ากันได้ของ Bourne Shell

ในทำนองเดียวกันคุณควรติดมันด้วยตัวคุณเอง.profile(ใช้.bash_profileถ้าคุณต้องการไวยากรณ์ของ bash) - มันอาจจะพิมพ์เพิ่มเติมเล็กน้อย แต่มันเป็นแบบพิเศษที่คุณทำทุกครั้ง การอ้างอิง${HOME}และไม่~ฯลฯ รสชาติบางอย่างของ Unix, งาน cron ทำงานภายใต้sh, แต่ละบรรทัดของคุณMakefileจะถูกประมวลผลโดยsh, ดังนั้นหากคุณกำลังทำงานกับ UNIX หลายรสชาติ, มันจ่ายเพื่อให้.profileบอร์นเชลล์ของคุณทำงานได้จริง ในฐานะผู้ดูแลระบบฉันไม่สามารถบอกคุณได้ว่ามีกี่ครั้งที่ฉันได้ช่วยคนอื่นโดยแก้ไข.profileให้เข้ากับ Bourne Shell ได้

บน Linux /bin/shเป็นลิงค์ไปยัง/bin/bashและเมื่อคุณเรียกใช้มันจะมีลักษณะเส้นทางที่ใช้ในการเรียกใช้และ (ตามทฤษฎี) จำกัด ตัวเองกับสิ่งที่ Bourne Shell สนับสนุนเท่านั้น ในทำนองเดียวกันviบน Linux ก็vimจำกัด ตัวเองอีกครั้ง บางครั้งคุณจะเห็นคุณสมบัติ "ตกเลือด" บางครั้งการvimแกล้งviทำจะทำสิ่งที่vimสนับสนุนซึ่งviไม่ได้เป็นเพราะผู้เขียนvimลืมที่จะปิดการใช้งานในโหมด "vi ย้อนหลังเข้ากันได้" ฉันจะไม่แปลกใจถ้าbashเสแสร้งว่าshมีฟีเจอร์ "Bleed through" ที่คล้ายกัน คงจะไม่แปลกใจหากฟีเจอร์ "ทำงานบน Borne Shell บน Linux" แต่ไม่ได้อยู่ในระบบ V หรือ BSD ที่ใช้ UNIX (AIX, OpenBSD, ฯลฯ )


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