ทำไมไม่มี shebang ใน. bashrc / .bash_profile


22

การสืบค้นง่าย ๆ : ฉันเพิ่งรู้ว่าฉันไม่เคยเห็นshebangทับ.bashrcสคริปต์ซึ่งทำให้ฉันคิดว่าระบบใช้เชลล์เริ่มต้นเพื่อหามันเมื่อล็อกอิน ( ${SHELL}) ฉันกำลังไตร่ตรองถึงสาเหตุที่เป็นเช่นนั้นคือมันถือว่าเป็นนิสัยที่ไม่ดีที่จะใช้สิ่งอื่นนอกเหนือจากเชลล์เริ่มต้นเพื่อเรียกใช้สคริปต์การเข้าสู่ระบบ


1
มีเหตุผลที่เรียกว่าbash rc ...
Ajedi32

คำตอบ:


28

.bashrcและ.bash_profileมีไม่สคริปต์ พวกเขากำลังกำหนดค่าไฟล์ที่ได้รับมาทุกครั้งbashจะดำเนินการในหนึ่งใน 2 วิธี

  • โต้ตอบ
  • เข้าสู่ระบบ

ภาวนาส่วนของหน้าคนทุบตีเป็นสิ่งที่เกี่ยวข้อง

เปลือกเข้าสู่ระบบเป็นหนึ่งที่มีตัวอักษรตัวแรกของการโต้แย้งเป็นศูนย์-หรือหนึ่งเริ่มต้นด้วย--loginตัวเลือก

โต้ตอบเปลือกเป็นหนึ่งที่ตั้งขึ้นโดยไม่ขัดแย้งไม่ใช่ตัวเลือกและไม่มี-cตัวเลือกที่มีมาตรฐานการป้อนข้อมูลและข้อผิดพลาดจะมีทั้งการเชื่อมต่อกับขั้ว (ตามที่กำหนดโดยisatty(3))หรือหนึ่งเริ่มต้นด้วย-i ตัวเลือก. PS1 มีการตั้งค่าและ $-รวมถึงiหากbashมีการโต้ตอบที่ช่วยให้เชลล์สคริปต์ หรือไฟล์เริ่มต้นเพื่อทดสอบสถานะนี้

ย่อหน้าต่อไปนี้อธิบายวิธีbashเรียกใช้งานไฟล์เริ่มต้น หากไฟล์ใด ๆ ที่มีอยู่ แต่ไม่สามารถอ่านได้ bash จะรายงานข้อผิดพลาด Tildes ถูกขยายในชื่อไฟล์ตามที่อธิบายไว้ด้านล่างภายใต้ Tilde Expansionใน ส่วนการขยาย

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

เมื่อเชลล์ล็อกอินออกจาก bash จะอ่านและดำเนินการคำสั่งจากไฟล์~/.bash_logoutหากมีอยู่

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

คุณสามารถควบคุมเมื่อพวกเขาได้รับการโหลดผ่านบรรทัดคำสั่งสวิทช์และ--norc --noprofileนอกจากนี้คุณยังสามารถแทนที่ตำแหน่งที่พวกเขาจะโหลดจากการใช้--rcfileสวิตช์

ดังที่คนอื่น ๆ พูดถึงคุณสามารถเลียนแบบวิธีการโหลดไฟล์เหล่านี้ผ่านการใช้source <file>คำสั่งหรือการใช้. <file>คำสั่ง

เป็นการดีที่สุดที่จะคิดถึงฟังก์ชั่นนี้ดังนี้:

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

วิธีการเรียกใช้

หัวข้อนี้ดูเหมือนจะเกิดขึ้นทุกครั้งดังนั้นนี่เป็นสูตรโกงเล็ก ๆ น้อย ๆ ของวิธีการต่าง ๆ ในการเรียกใช้bashและสิ่งที่เกิดขึ้นหมายเหตุ:เพื่อช่วยฉันเพิ่มข้อความ "sourced $ HOME / .bashrc" และ "sourced $ HOME / .bash_profile "ไปยังไฟล์ที่เกี่ยวข้อง

การโทรพื้นฐาน

  1. ทุบตี -i

    $ bash -i
    sourced /home/saml/.bashrc
    
  2. ทุบตี -l

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  3. ทุบตี - หรือ - ทุบตี - ลี่

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  4. ทุบตี -c "..cmd .. "

    $ bash -c 'echo hi'
    hi
    

    หมายเหตุ:ขอให้สังเกตว่า-cสวิตช์ไม่ได้ส่งไฟล์ทั้งไฟล์!

ปิดใช้งานไฟล์ config จากการอ่าน

  1. ทุบตี - หรือ

    $ bash --norc
    bash-4.1$ 
    
  2. ทุบตี - ไม่มีโปรไฟล์

    $ bash --noprofile
    sourced /home/saml/.bashrc
    
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
    
  4. bash --norc -l

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  5. ทุบตี - noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
    
  6. ทุบตี - noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
    
  7. bash --norc -i -or- bash --norc -l

    $ bash --norc -c 'echo hi'
    hi
    

วิธีที่ลึกลับกว่านี้ในการโทรทุบตี

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 
    

สิ่งเหล่านี้ล้มเหลว

  1. bash -i -rcfile ~ / .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify `/' in command names
    
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found
    

อาจมีมากกว่านี้ แต่คุณได้รับจุดหวังว่า ....

มีอะไรอีกบ้าง?

ท้ายสุดหากคุณสนใจในหัวข้อนี้ที่คุณต้องการอ่าน / สำรวจเพิ่มเติมเกี่ยวกับเรื่องนี้ฉันขอแนะนำให้ดูที่คู่มือผู้เริ่มต้นใช้งาน Bash ส่วนเฉพาะ: 1.2 ข้อดีของ Bourne Again SHell ส่วนย่อยต่างๆภายใต้หนึ่ง"1.2.2.1. การภาวนา"ผ่าน"1.2.2.3.3. พฤติกรรมเปลือก Interactive"bashอธิบายความแตกต่างในระดับต่ำระหว่างรูปแบบต่างๆที่คุณสามารถเรียกใช้


@amphibient - ขอโทษที่มันออกไปหน่อยหวังว่าผู้คนจะชื่นชมคุณค่าของมันและไม่ลงโทษด้วยการลงคะแนน ด้วยสิ่งนี้ที่นี่เราสามารถอ้างอิงได้ในคำตอบอื่น ๆ ตามถนน 8-) ฉันคิดจะทำโต๊ะเพื่อแสดงสิ่งนี้ แต่มันคงจะบ้าไปแล้ว 8-)
slm

มีการทดสอบจริง ๆ เหรอ? ฉันเคยพยายามที่จะทำตามสิ่งที่ทุบตีของฉันในการบีบและมันก็ไม่ได้ทำงานตามที่แนะนำ
Bananguin

@Bananguin - ทุกคำสั่งเหล่านั้นถูกเรียกใช้โดยฉันและนั่นคือเอาต์พุตที่สร้างขึ้นใต้คำสั่ง ที่มีศักยภาพเท่านั้น "สิ่ง" กับการตั้งค่าของฉันอาจเป็นไปได้ว่าฉันรวมถึงกองหลังไปยังแหล่งที่มา.bash_profile .bashrcแต่ฉันเชื่อว่าเป็นเรื่องปกติของการตั้งค่า
slm

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

คำตอบนี้ดียิ่งกว่าคำตอบใด ๆ ที่นี่stackoverflow.com/questions/415403/… !
Jacob Tomlinson

13

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

สคริปต์ดังกล่าวมีวัตถุประสงค์เพื่อเป็นsourced เนื่องจากโดยทั่วไปแล้วพวกเขาจะทำสิ่งต่าง ๆ เช่นตัวแปรสภาพแวดล้อมการเปลี่ยนแปลง ( $PATHตัวอย่างเช่น) ซึ่งคาดว่าจะคงอยู่หลังจากสคริปต์เสร็จสิ้น ดังนั้นมันจะไม่มีประโยชน์ที่จะลองใช้สิ่งใดสิ่งหนึ่งใน subshell


5

นอกเหนือจากการตอบกลับอื่น ๆ โปรดทราบว่าหากคุณต้องการไม่มีอะไรห้ามไม่ให้คุณใส่ Shebang ที่จุดเริ่มต้นของไฟล์การกำหนดค่าเหล่านี้

ที่จะไม่ทำร้ายเชลล์จัดหาพวกเขาเป็น shebang จะดำเนินการเช่นเดียวกับความคิดเห็นปกติคือละเว้น

ซึ่งอาจช่วยให้ผู้แก้ไขที่ใช้การเน้นไวยากรณ์เพื่อรู้ว่าภาษาการเขียนโปรแกรมใดที่ใช้ในไฟล์

โปรดทราบว่าผู้แก้ไขบางคนต้องการvimให้ทางเลือกเช่น modelines สำหรับหลัง นั่นคือคุณสามารถวางบรรทัดโหมดไว้ที่ส่วนท้าย~/.bashrcและ~/.bash_profileชอบดังนี้:

...
<code in ~/.bashrc>
...
# vim: ft=sh :

1
คำตอบที่ได้รับการยอมรับจาก @slm ด้านบนนั้นยอดเยี่ยม แต่นี่คือสิ่งที่ฉันกำลังมองหาโดยคำนึงถึงการเพิ่ม shebang ให้กับจุดเริ่มต้นของฉัน.bash_profileตามคำแนะนำจาก ShellCheck
jlucktay

1

ฉันอ่านสิ่งนี้ทุกที่ไม่ทราบว่าอยู่ที่ไหน แต่จริง

คู่มือ Bash ค่อนข้างสับสนในพื้นที่นี้ แต่ Bash ไม่ได้ eXecute ~ / .bash_profile เหมือนเชลล์สคริปต์ มันจะอ่านไฟล์แล้วดำเนินการคำสั่งภายในไฟล์นั้น (คุณสามารถทำสิ่งที่คล้ายกันได้โดยเรียกใช้ซอร์ส ~ / .bash_profile)

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