ทำไม / etc / profile ไม่ถูกเรียกใช้สำหรับเชลล์ที่ไม่ใช่การล็อกอิน?


51

ล็อกอินและเชลล์ที่ไม่ได้ล็อกอินกำหนด:

su - $USER # will give you a login shell
bash # will give you a non-login shell

/ etc / profile ไม่ถูกเรียกใช้สำหรับเชลล์ที่ไม่ใช่การเข้าสู่ระบบเช่นเมื่อคุณเริ่ม konsole (kde) / etc / profile ถูกเรียกใช้สำหรับเชลล์ล็อกอินเท่านั้น

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

คำตอบ:


99

/etc/profile ถูกเรียกใช้สำหรับเชลล์ล็อกอินเท่านั้นเนื่องจากเป็นวัตถุประสงค์เฉพาะ

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

วัตถุประสงค์ของไฟล์ "profile" คือการมีคำสั่งที่ควรรันสำหรับ shell shell เท่านั้น ไฟล์เหล่านี้คือ:

  • /etc/profileดำเนินการโดยเชลล์ที่เข้ากันได้กับ Bourneทั้งหมด(รวมถึงbashและdash) เมื่อเริ่มต้นเป็นเชลล์ล็อกอิน

  • /etc/profile.dสคริปใน

    สิ่งนี้มีไว้สำหรับเชลล์สไตล์ Bourne แต่ไม่ได้เข้ารหัสลงในเชลล์ที่สามารถเรียกใช้งานได้ ค่อนข้างคำสั่งในการ/etc/profileเรียกพวกเขา ตัวอย่างเช่นในระบบ Ubuntu 12.04 ของฉัน/etc/profileรวมถึงบรรทัดเหล่านี้:

    if [ -d /etc/profile.d ]; then
      for i in /etc/profile.d/*.sh; do
        if [ -r $i ]; then
          . $i
        fi
      done
      unset i
    fi
    
  • .profile ในโฮมไดเร็กตอรี่ของผู้ใช้, รันโดยเชลล์ที่เข้ากันได้กับ Bourne เมื่อเริ่มเป็นเชลล์ล็อกอิน (ยกเว้นแทนที่, ดูด้านล่าง)

  • .bash_profileหรือ.bash_loginในไดเรกทอรีบ้านของผู้ใช้ เชลล์เหล่านี้จะถูกละเว้นโดยนอกเหนือbashจาก แต่ถ้า.bash_profileมีอยู่แล้วbashมันวิ่งแทน .profileถ้า.bash_profileไม่ได้อยู่ แต่มีอยู่ว่าจะดำเนินการแทน.bash_login.profile

    (แต่เป็นเรื่องปกติสำหรับ.bash_profileหรือ.bash_loginเมื่อมีอยู่จะถูกเขียนเพื่อโทร * อย่างชัดเจน.profile)

    ประโยชน์ของไฟล์โปรไฟล์เชลล์เฉพาะคือสามารถมีคำสั่งหรือไวยากรณ์ที่ใช้ได้สำหรับเชลล์นั้นเท่านั้น ตัวอย่างเช่นฉันสามารถใช้ตัว[[ดำเนินการประเมินผลใน.bash_profile/ .bash_loginแต่ถ้าฉันใช้มัน.profileแล้วเข้าสู่ระบบด้วยdashเป็นเปลือกของฉันมันจะล้มเหลว

สิ่งที่ควรไปในไฟล์ "โปรไฟล์"

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

คุณอาจต้องการเรียกใช้คำสั่งเพียงครั้งเดียวเพราะ:

  1. ไม่มีเหตุผลที่จะเรียกใช้มากกว่าหนึ่งครั้งต่อการเข้าสู่ระบบมันจะไม่มีประสิทธิภาพหรือ
  2. มันจะสร้างผลลัพธ์ที่ไม่พึงประสงค์เพื่อเรียกใช้มากกว่าหนึ่งครั้งต่อการเข้าสู่ระบบ

เป็นตัวอย่างของสถานการณ์ที่สองซึ่งผลลัพธ์ที่ไม่พึงประสงค์จะเกิดขึ้นให้พิจารณาบรรทัดเหล่านี้ซึ่งปรากฏตามค่าเริ่มต้นในผู้ใช้ทุกคน~/.profile:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

สมมติว่าคุณ SSH เข้ารันเชลล์อื่น (พูดว่าzsh) ในบางจุดพบว่าคุณต้องการกลับไปชั่วคราวbashแต่รักษาสภาพแวดล้อมของคุณไว้ (ดังนั้นให้วิ่งbashอีกครั้งในขณะนั้นzsh) แล้วรันโปรแกรมเช่นmcนั้นทำงานเชลล์เป็นส่วนหนึ่ง ของอินเตอร์เฟส หากbinมีอยู่ในโฟลเดอร์ที่บ้านของคุณและชื่อผู้ใช้ของคุณเป็นjamesของคุณPATHในเปลือกด้านในสุดเป็นสิ่งที่ต้องการ:

/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

นั่นคือไม่มีประสิทธิภาพและ (มากที่สำคัญกว่า) PATHทำให้มันยากที่จะเข้าใจเนื้อหาของ

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

สถานที่ที่จะวางคำสั่งสำหรับทุก Shell Interactive ให้ทำงาน

หากคุณกำลังใช้bashอยู่มีไฟล์สำหรับคำสั่งที่จะรันในทุกเชลล์แบบโต้ตอบ:

  • /etc/bash.bashrc
  • .bashrc ในไดเรกทอรีบ้านของผู้ใช้

สิ่งนี้ใช้กันมากที่สุดสำหรับคำสั่งนั้น

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

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

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

ที่นั่นทั้ง1และ2 มีการใช้งาน: นี่ไม่ได้ดำเนินการกับเชลล์อื่น ๆ ที่ทำงานอยู่ภายในเชลล์นี้และการเติมแท็บควรจะทำงานbashได้แม้ว่าฉันจะลงชื่อเข้าใช้ด้วยเชลล์อื่น

ตำแหน่งที่จะใช้คำสั่งสำหรับล็อกอินเชลล์และเชลล์ที่ไม่ใช่การล็อกอินแบบโต้ตอบ

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

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

(ในทำนองเดียวกัน/etc/profileแหล่งที่มา/etc/bash.bashrcของbash.)

ดังนั้นไฟล์ "โปรไฟล์" และ "rc" จึงทำงานเมื่อคุณเริ่มbashเชลล์แบบโต้ตอบ(ไม่ว่าจะเป็นเชลล์ล็อกอินหรือไม่ก็ตาม)

จะใช้คำสั่งให้เรียกใช้งานในเชลล์ที่ไม่มีการโต้ตอบได้ที่ไหน

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

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

ในbashที่ "RC" ไฟล์จะถูกเรียกใช้จริงไม่ว่าจะเป็นเปลือกที่มีการโต้ตอบหรือไม่ อย่างไรก็ตามที่ด้านบนพวกเขาพูดว่า:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

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

เริ่มต้นเข้าสู่ระบบเชลล์

การเข้าสู่ระบบเริ่มต้นเชลล์การเข้าสู่ระบบ หากคุณต้องการให้เชลล์เริ่มทำงานหลังจากนั้นให้ทำหน้าที่เป็นเชลล์ล็อกอินให้เริ่มด้วยเชลล์-l(หมายถึงl ogin ) ตัวอย่างเช่น:

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

  • sudo -iสำหรับroot(ใช้sudo -sสำหรับ non-login, root shell แบบโต้ตอบ)
  • sudo -u username -i สำหรับผู้ใช้ใด ๆ
  • su - usernameสำหรับrootผู้ที่ไม่ใช่ผู้ใช้ (ใช้สำหรับผู้ใช้ที่ไม่ใช่การเข้าสู่ระบบ, รูทเชลล์แบบโต้ตอบ)su username

อะไรคือเริ่มต้นเปลือกเข้าสู่ระบบ?

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

เหตุผลหนึ่งสำหรับคำว่าinital login shellก็คือlogin shellนั้นใช้ในแง่ที่แตกต่างกัน - เพื่อระบุว่าโปรแกรมใดที่ใช้เป็นเชลล์ที่ถูกเรียกใช้งานโดยการล็อกออน นี่คือความรู้สึกของเปลือกเข้าสู่ระบบที่ใช้ในการพูด:

  • " เชลล์การเข้าสู่ระบบเริ่มต้นของOpenBSDคือkshใน Ubuntu มันเป็นbash"
  • "คุณสามารถเปลี่ยนเชลล์ล็อกอินด้วยchsh"

อ่านเพิ่มเติม


4
หนึ่งในคำตอบที่ดีที่สุดสำหรับคำถามใด ๆ ในเว็บไซต์ Stack Exchange
Mark E. Haase

1
> ไฟล์ "profile" ควรมีคำสั่งที่ควรรันเพียงครั้งเดียวเท่านั้นในตอนเริ่มต้นของการเข้าสู่ระบบ (ซึ่งรวมถึงการเข้าสู่ระบบกราฟิกขณะที่พวกเขาเริ่มต้นด้วยเปลือกเข้าสู่ระบบด้วย) ไม่มีไม่ไม่ไม่ไม่! มันไม่ได้อย่างแน่นอน! เชลล์ที่มีลักษณะคล้าย bourne ทั้งหมดอ่าน. profile บนเซสชันเชลล์ล็อกอินแบบโต้ตอบเท่านั้นนั่นคือเริ่มต้นด้วยตัวเลือก -i หรือที่เชื่อมต่อกับเทอร์มินัลการควบคุม เหตุผลนี้เป็นจริงเพราะจุดของไฟล์นี้คือการตั้งค่าเทอร์มินัลของผู้ใช้ไม่ใช่แค่สภาพแวดล้อมของพวกเขา หากผู้จัดการจอแสดงผล tr

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

1
In bash, the "rc" files are actually run whether the shell is interactive or not. ไม่ถูกต้อง /etc/bash.bashrc ทำงานโดย /etc/bash.profile
okwap

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