/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" ควรมีคำสั่งที่ควรรันเพียงครั้งเดียวเท่านั้นในตอนต้นของการเข้าสู่ระบบ (ซึ่งรวมถึงการเข้าสู่ระบบแบบกราฟิกเช่นที่พวกเขาเริ่มต้นด้วยเปลือกเข้าสู่ระบบเช่นกัน) ถ้าเปลือกเป็นแบบโต้ตอบผู้ใช้ที่ทำงานมันอาจเข้าสู่ระบบและดังนั้นจึงอาจมีบรรพบุรุษ (ที่เริ่มมันหรือเริ่มสิ่งที่เริ่มมัน หรือเริ่มสิ่งนั้นเป็นต้น) นั่นคือเชลล์ล็อกอิน
คุณอาจต้องการเรียกใช้คำสั่งเพียงครั้งเดียวเพราะ:
- ไม่มีเหตุผลที่จะเรียกใช้มากกว่าหนึ่งครั้งต่อการเข้าสู่ระบบมันจะไม่มีประสิทธิภาพหรือ
- มันจะสร้างผลลัพธ์ที่ไม่พึงประสงค์เพื่อเรียกใช้มากกว่าหนึ่งครั้งต่อการเข้าสู่ระบบ
เป็นตัวอย่างของสถานการณ์ที่สองซึ่งผลลัพธ์ที่ไม่พึงประสงค์จะเกิดขึ้นให้พิจารณาบรรทัดเหล่านี้ซึ่งปรากฏตามค่าเริ่มต้นในผู้ใช้ทุกคน~/.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
ในไดเรกทอรีบ้านของผู้ใช้
สิ่งนี้ใช้กันมากที่สุดสำหรับคำสั่งนั้น
- ส่งผลกระทบต่อสภาพแวดล้อมของเชลล์ที่พวกมันทำงานเท่านั้นไม่ใช่แม้แต่เปลือกลูกหรือ
- ควรรันแม้ว่าจะไม่ใช่เชลล์ล็อกอิน
ตัวอย่างเช่นโดยทั่วไปการเปิดใช้งานแท็บบรรทัดคำสั่งควรเปิดใช้งานไม่ว่าจะ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
"
อ่านเพิ่มเติม