ทำไม ~ / .bash_profile ของฉันไม่ทำงาน


35

ฉันใช้ Linux Mint เปลือกเข้าสู่ระบบของฉัน ( cat /etc/passwd | grep myUserName) เป็นทุบตี

หลังจากที่ฉันเริ่มสภาพแวดล้อมเดสก์ท็อปแบบกราฟิกและเรียกใช้โปรแกรมจำลองเทอร์มินัลจากนั้นฉันจะเห็นว่าไม่ได้.bash_profileมีแหล่งที่มา (vars สภาพแวดล้อมที่มีการexportแก้ไขจะไม่ถูกตั้งค่า) แต่ถ้าฉันเข้าสู่ระบบจากคอนโซลข้อความ ( ctrl+ alt+ F1) หรือเรียกใช้ด้วยตนเองbash -lจาก terminal emulator .bash_profileทำงานได้ดี

ฉันผิดเมื่อฉันคิดว่า.bash_profileควรจะมีแหล่งที่มาเมื่อ X เริ่มทำงานและexportvars ed ทั้งหมดควรมีอยู่ในเครื่องเทอร์มินัลโดยเรียกใช้จาก X หรือไม่

PS การวางทุกอย่างใน.bashrcและจัดหาจาก.bash_profileไม่ใช่ความคิดที่ดี ( https://stackoverflow.com/questions/902946/ ): สิ่งที่สภาพแวดล้อมควรได้รับแหล่งที่มาเพียงครั้งเดียว

คำตอบ:


38

ไฟล์~/.bash_profileถูกอ่านโดย bash เมื่อเป็นเชลล์ล็อกอิน นั่นคือสิ่งที่คุณจะได้รับเมื่อคุณเข้าสู่ระบบในโหมดข้อความ

เมื่อคุณเข้าสู่ภายใต้ X, /bin/shสคริปต์เริ่มต้นที่มีการดำเนินการโดย บน Ubuntu และ Mint /bin/shเป็นเส้นประไม่ใช่ทุบตี เส้นประและทุบตีมีคุณลักษณะหลักเหมือนกัน แต่ขีดติดกับคุณลักษณะหลักเหล่านี้เพื่อให้เร็วและเล็กในขณะที่ทุบตีเพิ่มคุณลักษณะจำนวนมากในราคาที่ต้องการทรัพยากรมากขึ้น เป็นเรื่องปกติที่จะใช้เส้นประสำหรับสคริปต์ที่ไม่ต้องการคุณสมบัติพิเศษและทุบตีสำหรับการใช้งานแบบโต้ตอบ (แม้ว่าzsh จะมีคุณสมบัติที่ดีกว่ามาก )

รวมกันมากที่สุดของผู้จัดการจอแสดงผล (โปรแกรมที่คุณพิมพ์ชื่อผู้ใช้และรหัสผ่าน) และสภาพแวดล้อมเดสก์ทอปอ่าน~/.profileจากสคริปต์การเข้าสู่ระบบใน/etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsessionหรือแล้วแต่มีผลบังคับใช้ ~/.profileดังนั้นใส่คำนิยามตัวแปรสภาพแวดล้อมของคุณ ตรวจสอบให้แน่ใจว่าใช้ไวยากรณ์ที่ขีดกลางเท่านั้น

ดังนั้นสิ่งที่คุณควรวางที่ไหน

  • .bash_profileโหลดดี.profileและโหลด.bashrcถ้าเชลล์เป็นแบบโต้ตอบ

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
  • ใน.profileใส่คำนิยามตัวแปรสภาพแวดล้อมและการตั้งค่าเซสชั่นอื่น ๆ ulimitเช่น

  • ใน.bashrcใส่การตั้งค่าแบบอินเทอร์แอคทีฟของ bash เช่น alias, ฟังก์ชั่น, เสร็จสิ้น, การเชื่อมโยงคีย์ (ที่ไม่ได้อยู่.inputrc), ...

ดูความแตกต่างระหว่างล็อกอินเชลล์และเชลล์ที่ไม่ใช่ล็อกอิน? และทางเลือกในการ . bashrc


หลายสิ่งที่ได้เรียนรู้จากคำตอบเดียว :)
MTK

16

.bash_profileเป็นสคริปต์การกำหนดค่าเริ่มต้นของ bash ไม่มีมาตรฐานอิง X .bash_profileไปยังแหล่งที่มีอยู่

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

Debian เคยใช้แหล่ง.profileที่มาในการเข้าสู่ระบบแบบกราฟิก ( หน้า wiki ณ ปี 2013 ) ตอนนี้มันไม่ได้ ( หน้า wiki ณ ปี 2016 )

แหล่งข้อมูล Arch .xprofileที่การเข้าสู่ระบบแบบกราฟิก ( หน้า wiki ในปี 2013 )

Ubuntu เคยกีดกันการใช้.profile( หน้า wiki ตั้งแต่ปี 2013 ) ตอนนี้มันไม่ย่อท้ออีกต่อไป ( หน้า wiki ตั้งแต่ปี 2559 )


เกี่ยวกับคำถามอื่น ๆ ของคุณ: ทำไม ~ / .bash_profile ของฉันไม่ทำงาน นั่นคือพฤติกรรมที่คาดหวัง

พฤติกรรมในระยะสั้นมีดังนี้:

  • bash เริ่มต้นเป็นเชลล์ล็อกอินแบบโต้ตอบ: อ่าน ~/.profile
  • bash เริ่มต้นเป็นเชลล์แบบไม่ล็อกอิน: อ่าน ~/.bashrc

สำหรับรายละเอียดเพิ่มเติมดูคำตอบของฉันสำหรับคำถามที่คล้ายกันใน askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shoes-doesnt-read-bashrc / 132319 # 132319


1
สิ่งนี้ถูกต้อง แต่~/.bashrcคำแนะนำ“ อ่านเสมอ” เป็นคำแนะนำที่ไม่ดี: คุณควรอ่าน.bashrcจากเชลล์แบบโต้ตอบเท่านั้น คุณพลาดปัญหาหลักที่นี่ซึ่งเมื่อเข้าสู่ระบบภายใต้ X จะไม่มีอินสแตนซ์การเข้าสู่ระบบของ bash (ภายใต้ชุดเครื่องมือจัดการดิสเพลย์ / สภาพแวดล้อมเดสก์ท็อปส่วนใหญ่รวมถึงของ AntonioK อย่างเห็นได้ชัด)
Gilles 'หยุดชั่วร้าย'

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

2
" อูบุนตูไม่สนับสนุนการใช้.profile( ลิงก์ ) " วิกิเคยทำครั้งเดียว (ไร้สาระ) ทำให้หมดกำลังใจ ที่ได้รับการแก้ไข (หมายเหตุ/etc/profileยังคงหมดกำลังใจสำหรับการกำหนดทั่วทั้งระบบในการตั้งค่าสำหรับการเพิ่มสคริปต์ไป/etc/profile.d) .profileไฟล์ต่อผู้ใช้จะถูกนำเสนอเป็นหนึ่งในวิธีที่แนะนำในการตั้งค่าตัวแปรสภาพแวดล้อมต่อผู้ใช้: "ไฟล์ที่เหมาะสมสำหรับการตั้งค่าตัวแปรสภาพแวดล้อม ผู้ใช้เฉพาะ (แทนที่จะเป็นระบบโดยรวม) คือ~ / .pam_environmentและ~ / .profile "
Eliah Kagan

เพจที่เชื่อมโยงเกี่ยวกับ Debian ระบุว่า Debian ไม่ได้อ่าน~/.profileสำหรับการเข้าสู่ระบบแบบกราฟิกและ~/.xsessionrcควรใช้แทน
karora

ขอบคุณที่สังเกต หน้า wiki ได้รับการอัพเดต ฉันเชื่อมโยงไปยังรุ่นต่าง ๆ ตามเวลาที่ตอบไว้
lesmana

2

มีปัญหาบางอย่างเกิดขึ้นเมื่อพยายามโหลด / source ~ / .profile file [นี่หมายถึง Ubuntu linux - ในบางกรณีรายละเอียดของคำสั่งจะแตกต่างกัน]

  1. คุณกำลังรันสิ่งนี้โดยตรงในเทอร์มินัลหรือในสคริปต์?
  2. คุณจะเรียกใช้สิ่งนี้ในสคริปต์ได้อย่างไร?

การโฆษณา 1)

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

source ~/.bash_profile

หรือ

. ~/.bash_profile

ในทั้งสองกรณีนี้จะอัปเดตสภาพแวดล้อมด้วยเนื้อหาของไฟล์. profile

โฆษณา 2) คุณสามารถเริ่มสคริปต์ทุบตีใดก็ได้โดยโทร

sh myscript.sh 

หรือ

. myscript.sh

ในกรณีแรกนี้จะสร้าง subshell ที่จะไม่ส่งผลกระทบต่อตัวแปรสภาพแวดล้อมของระบบของคุณและพวกเขาจะมองเห็นได้เฉพาะกับกระบวนการ subshell หลังจากเสร็จสิ้นคำสั่ง subshell จะไม่มีการใช้การส่งออกและอื่น ๆ นี่เป็นข้อผิดพลาดทั่วไปและเป็นสาเหตุให้นักพัฒนาจำนวนมากเสียเวลามากมาย

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

.myscript.sh

คำสั่ง

เพื่อให้แน่ใจว่าสคริปต์ของคุณจะไม่ถูกเรียกใช้ใน subshel ​​คุณสามารถใช้ฟังก์ชันนี้ (อีกตัวอย่างสำหรับ Ubuntu เชลล์)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

ฉันหวังว่าสิ่งนี้จะช่วยขจัดความเข้าใจผิดที่พบบ่อยบางอย่าง! : D โชคดี!


1

ในคำถามของคุณคุณอ้างถึงhttps://stackoverflow.com/questions/902946/เพื่อเป็นการแนะนำว่าอย่าให้แหล่งที่มาเมื่อคำตอบที่ยอมรับนั้นกำหนดให้

  • ใส่การตั้งค่า PATH ของฉันลงในไฟล์. profile (เพราะบางครั้งฉันใช้เชลล์อื่น ๆ )
  • ใส่นามแฝงและฟังก์ชัน Bash ของฉันลงในไฟล์. bashrc ของฉัน
  • จากนั้นใช้ [แก้ไข: snip code-comments]:

    .bash_profile:

    #!/bin/bash
    # echo "Loading ${HOME}/.bash_profile"
    source ~/.profile # Get the paths
    source ~/.bashrc  # get aliases

การใส่ทุกอย่างลงใน.profileไม่ได้ผลสำหรับฉันใน Linux Mint ใช้.bashrcงานได้ดี


0

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

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