การทำความเข้าใจ. bashrc และ. bash_profile


26

บนเซิร์ฟเวอร์เมื่อฉันเข้าสู่ระบบในฐานะ root ฉันเห็น.bashrc(Ubuntu 10.10)

สำหรับ Mac ของฉันฉันมี .bash_profile

Ubuntu มี.bashrcไฟล์อยู่.bash_profileหรือไม่ (ฉันแค่สับสนดังนั้นถามฉันรู้ว่าพวกเขาจะแตกต่างกันของ o / s แต่อาจจะมีความสัมพันธ์อย่างใด?)

บนเซิร์ฟเวอร์ของฉันฉันต้องการสร้างชื่อแทนฉันควรใส่ไว้ใน.bashrcอะไร

ถ้าฉันต้องการให้นามแฝงนี้ถูกใช้เพื่อให้ผู้ใช้ทุกคนสามารถใช้ได้


1
อาจซ้ำกันของ: askubuntu.com/questions/1528/bashrc-or-bash-profile - ฉันขอแนะนำให้คุณเปลี่ยนคำถามของคุณเพียงแค่ถามว่าจะใส่ชื่อแทนที่ไหน

คำตอบ:


39

ชื่อแทนทุบตีควรไปใน.bash_aliasesหรือ.bashrcไฟล์ในไดเรกทอรีบ้านแต่ละรายการ หากคุณต้องสร้างนามแฝงทุบตีทั่วโลกพวกเขาสามารถเข้าไปได้/etc/bash.bashrcแต่มักจะเป็นการง่ายที่สุดที่จะเพิ่มพวกเขาลงในไฟล์.bash_aliasesหรือเพื่อที่พวกเขาจะได้รับมรดกโดยผู้ใช้ที่สร้างขึ้นใหม่.bashrc/etc/skel

มันเป็นความจริงที่ไม่ถูกต้องเสมอเพื่อกำหนดนามแฝงในใน.profile, หรือ.bash_profile/etc/profile

จะเข้าใจว่าทำไมหนึ่งต้องเข้าใจสิ่งที่อยู่ภายใต้คำสั่งสถานการณ์จากแต่ละไฟล์เหล่านี้จะถูกเรียกใช้ มีความเข้าใจผิดเกี่ยวกับสิ่งนี้ซึ่งฉันได้กล่าวไว้ด้านล่าง

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

นามแฝงสำหรับผู้ใช้ส่วนบุคคล

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

โดยเฉพาะอย่างยิ่งถ้าคุณเคยล็อกอินแบบไม่ใช้กราฟิกในคอนโซลเสมือนหรือผ่าน SSHคุณอาจใช้ล็อกอินเชลล์ในบางครั้ง ดังนั้นคุณจะต้องการให้นามแฝงของคุณทำงานในเชลล์ล็อกอินแบบโต้ตอบด้วย

เมื่อเชลล์แบบโต้ตอบและไม่ใช่การล็อกอินเริ่มต้นมันจะเริ่มต้น.bashrcในโฮมไดเรกทอรีของผู้ใช้ ตามค่าเริ่มต้นใน Ubuntu .bashrcแหล่งตัวเองของผู้ใช้แต่ละคน.bash_aliasesหากมีอยู่

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

อ่านความคิดเห็นในการเริ่มต้นอูบุนตูที่.bashrcเผยให้เห็นว่ามันตั้งใจอย่างเป็นทางการว่านามแฝงไปหรือ.bashrc มีคำจำกัดความของนามแฝงอยู่แล้ว (เรียกใช้เพื่อดู) และให้คำแนะนำอย่างชัดเจนเกี่ยวกับตำแหน่งที่จะวางคำจำกัดความใหม่ดังกล่าว.bash_aliases.bashrcgrep '^[[:blank:]]*alias' ~/.bashrc

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

แต่แล้วเชลล์ล็อกอินแบบโต้ตอบล่ะ แทนที่จะแหล่งหอยเข้าสู่ระบบ.bashrc.profile

  • ... ถ้า.bash_loginไม่มีแล้วมันก็จะกลายเป็นแหล่งที่มาแทน
  • ... ถ้า.bash_profileไม่มีแล้วมันก็จะกลายเป็นแหล่งที่มาแทน

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

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

ฉันขอแนะนำให้ผู้ใช้กำหนดนามแฝงทุบตีใหม่ใน.bash_aliasesไดเรกทอรีบ้านของพวกเขา นี่เป็นวิธีที่ง่ายและสะอาดเป็นพิเศษในการสร้างคำจำกัดความของชื่อแทนถาวรในระดับต่อผู้ใช้

ไม่ควรกำหนดนามแฝง.profileเนื่องจากจะยังไม่ได้กำหนดในเปลือกที่ไม่ใช่การเข้าสู่ระบบ ไม่เหมือนกับสภาพแวดล้อมของ bash shell ส่วนใหญ่ aliases จะไม่ถูกส่งออกไปยัง child shells:

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found

โดยเฉพาะอย่างยิ่งโดยค่าเริ่มต้นสภาพแวดล้อมเดสก์ทอปส่วนใหญ่ทำให้.profileมีที่มาจากการเข้าสู่ระบบกราฟิก แต่:

  1. สิ่งนี้ไม่จำเป็นต้องทำโดย bash shell ดังนั้นนิยาม alias อาจไม่ถูกประมวลผลและที่สำคัญกว่านั้น
  2. แม้ว่าคำจำกัดความนามแฝงมีการประมวลผลที่พวกเขาไม่ได้รับการส่งต่อไปยังกระบวนการที่เด็ก โดยเฉพาะอย่างยิ่งพวกมันจะไม่ถูกส่งไปยังเชลล์ที่สร้างโดยการเปิดหน้าต่างเทอร์มินัล!

ไม่ควรกำหนดนามแฝงใน.bash_profile(หรือ.bash_login)ด้วยเหตุผลเดียวกัน แต่ด้วยเหตุผลอื่น สร้างไฟล์เหล่านี้อย่างไร้เดียงสาและวางคำจำกัดความเพียงนามแฝงไว้ในไฟล์เพื่อป้องกันไม่ให้โค้ดใด ๆ.profileทำงาน!

ในสถานการณ์ที่.bash_profileหรือ.bash_loginมีประโยชน์จริง ๆ โดยทั่วไปมักจะมีแหล่งข้อมูลหนึ่ง.profileอยู่ที่ใดที่หนึ่งซึ่งสามารถแก้ไขปัญหานั้นได้ (จากนั้นปัญหาเดียวที่เหลืออยู่ก็คือ.profileการกำหนดนามแฝงใน.bash_profileหรือ.bash_loginไม่ทำงาน)

นามแฝงสำหรับผู้ใช้รายใหม่โดยอัตโนมัติ

เมื่อบัญชีผู้ใช้ประเภทที่ต้องการแสดงถึงความเป็นมนุษย์ที่แท้จริงถูกสร้างขึ้นโดยทั่วไปแล้วไดเรกทอรีใหม่จะถูกสร้างขึ้นเพื่อใช้เป็นโฮมไดเรกทอรีของพวกเขา เนื้อหาของ/etc/skelจะถูกคัดลอกไปยังไดเรกทอรีบ้านของพวกเขา นี่คือวิธีที่ผู้ใช้หลายคนเริ่มด้วยไฟล์กำหนดค่าที่คล้ายกันในโฮมไดเร็กตอรี่ ใน Ubuntu นี้รวมถึง.profile, .bashrcและไฟล์อื่น ๆ บางส่วน

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

หากคุณแก้ไขไฟล์ที่มีอยู่แล้วใน/etc/skelคุณอาจต้องการสำรองข้อมูลก่อน - แต่คุณไม่ควรทำการสำรองข้อมูล/etc/skelหรือไม่เช่นนั้นจะถูกคัดลอกไปยังโฮมไดเร็กตอรี่ของผู้ใช้ใหม่

นี่เป็นวิธีที่ดีที่สุดสำหรับคุณในการเพิ่มชื่อแทนใหม่สำหรับผู้ใช้หลายคน ผู้ใช้ที่มีอยู่สามารถเพิ่มชื่อแทนได้เอง หากคุณกำหนดนามแฝงใน/etc/skel/.bash_aliasesคุณสามารถนำพวกเขาไปยังไฟล์ที่พวกเขาอาจเลือกที่จะคัดลอกลงในไดเรกทอรีบ้านของพวกเขา (หรือเพิ่มลงใน.bash_aliasesไฟล์ที่กำหนดเองของพวกเขา)

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

นามแฝงส่วนกลางสำหรับผู้ใช้ทั้งหมด

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

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

สิ่งนี้คล้ายคลึงกับวิธีการเริ่มต้นต่อ.profileแหล่งที่มาของผู้ใช้ต่อผู้ใช้.bashrcถ้าเชลล์นั้นทุบตี (ตามรายละเอียดด้านบน)

นี่คือลักษณะที่แท้จริงของรหัสนี้ในค่าเริ่มต้น/etc/profile:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

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

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

สุดท้ายโปรดทราบว่าไฟล์.bashrcเริ่มต้น/etc/bash.bashrcจะไม่มีสิ่งใด ๆ เกี่ยวกับชื่อแทนซึ่งแตกต่างจากค่าเริ่มต้นต่อผู้ใช้ มันค่อนข้างแปลกที่จะให้ชื่อแทนผู้ใช้ในไฟล์ที่พวกเขาไม่สามารถแก้ไขหรือปิดการใช้งานพวกเขา (แน่นอนพวกเขายังคงสามารถทำเช่นนั้นได้โดยการเอาชนะพวกเขาในคำจำกัดความของตัวเองในท้องถิ่นของตน.bashrc, .bash_aliasesหรือที่อื่น ๆ .)

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


5

นี่คือบางส่วนอ่านที่ดีเกี่ยวกับมัน ".bash_profile ถูกเรียกใช้งานสำหรับเชลล์การเข้าสู่ระบบในขณะที่. bashrc ถูกดำเนินการสำหรับเชลล์ที่ไม่ใช่การเข้าสู่ระบบแบบโต้ตอบ"

ดังนั้นสำหรับนามแฝงของคุณให้ใช้. bash_profile


4
การใส่ชื่อแทน.bash_profileไม่ถูกต้อง ใน Ubuntu .profileแหล่งที่มา (ซึ่งใช้สำหรับเชลล์เข้าสู่ระบบ) .bashrcเมื่อเป็นเชลล์ bash แบบโต้ตอบ ดังนั้นการวางนามแฝงใน.bashrc(หรือ.bash_aliasesแหล่งที่มา.bashrc) กำหนดไว้ในเปลือกทุบตีแบบโต้ตอบทั้งหมด นามแฝง.bash_profileทำให้ปัญหานี้ในหมู่คนอื่น ๆ ดูนี้ , ที่ , คำตอบของฉันและเริ่มต้นของความคิดเห็นแนะนำการวางนามแฝงมีหรือ~/.bashrc .bash_aliases
Eliah Kagan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.