ฉันกำลังใช้การติดตั้ง Oneiric ใหม่ (เช่นไม่ใช่การอัปเกรด) บนระบบที่แตกต่างกันสองระบบและทำงานในปัญหาเดียวกันที่เกี่ยวข้อง
พวงที่น่าผิดหวังที่สุดคือเมื่อฉันใช้. profile และ. bashrc ที่ฉันพกติดตัวไปด้วยจาก Mac OS X การเข้าสู่ X ผ่าน LightDM จะทำให้ฉันออกจากระบบทันที ฉันเชื่อว่าสิ่งนี้เกิดจากความจริงที่ว่าเมื่อรัน "/ bin / sh" มันจะทำงานเป็น / bin / dash แต่ยังคงมีตัวแปร $ SHELL ตั้งเป็น / bin / bash
การคาดการณ์
.bashrc
ฉันมีขนาดใหญ่ คุณสามารถดูได้ที่นี่หากคุณต้องการ แต่เนื้อหาอาจไม่เกี่ยวข้องนอกเหนือจากข้อเท็จจริงที่ว่ามันเต็มไปด้วย bashisms และความจริงที่ว่ามันทำงานได้โดยไม่มีข้อผิดพลาดภายใน xterm หรือบนคอนโซลเสมือน
.profile
หน้าตาของฉันแบบนี้ (ตัวย่อ):
case $SHELL in
*bash*)
if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
. $HOME/.bashrc
fi
;;
esac
หากฉันพยายามเข้าสู่ X ผ่าน LightDM มันจะเข้าสู่ระบบของฉันทันทีที่ออกจากระบบ ฉันพบข้อผิดพลาด.xsession-errors
เกี่ยวกับ. bashrc ของฉันที่มีลักษณะเช่นนี้ (ตัวย่อ):
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
อย่างที่ฉันพูดเมื่อฉันเรียกใช้ bash จากคอนโซลเสมือนฉันไม่ได้รับข้อผิดพลาดเหล่านี้ นอกจากนี้หากฉันลบ. profile ของฉันฉันสามารถเข้าสู่ X ได้ดี (ฉันยังสามารถเข้าสู่คอนโซลเสมือนและใช้startx
เพื่อเริ่มต้นเซสชัน X ที่ใช้งานได้ แต่นี่ไม่ใช่วิธีการแก้ปัญหาระยะยาว)
อย่างไรก็ตามฉันค้นพบว่าถ้าฉันวิ่ง/bin/sh -l
ฉันจะได้รับข้อผิดพลาด ต่อไปนี้เป็นตัวอย่างเซสชัน (หมายเหตุ: bash prompt ที่ฉันทำง่ายbash>
ขึ้นและ sh prompt เป็นเพียง$
):
bash> echo $SHELL
/bin/bash
bash> echo $BASH_VERSION
4.2.10(1)-release
bash> /bin/sh -l
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
$ echo $SHELL
/bin/bash
$ echo $BASH_VERSION
$
Q1: ทำไมสิ่งนี้จึงเกิดขึ้น
ฉันเข้าใจว่า/ bin / sh ชี้ไปที่การประมากกว่าการทุบตีแต่ถ้าเป็นจริงแล้วทำไม$SHELL
ยังคงกลับมา/bin/bash
?
Q2: ฉันจะแก้ไขปัญหานี้ได้อย่างไร
มีวิธีแก้ไขไหม ฉันต้องการเก็บโปรไฟล์ของฉันไว้. bashrc เพื่อให้ฉันได้รับสภาพแวดล้อมเดียวกันทั้งในการเข้าสู่ระบบและที่ไม่ใช่การเข้าสู่ระบบเปลือกหอย แต่เห็นได้ชัดว่าฉันต้องการให้โหลดเพื่อทุบตีเท่านั้นไม่ใช่ / bin / sh masquerading
คุณอาจสังเกตเห็นความแตกต่างในเนื้อหาของตัวแปร $ BASH_VERSION ด้านบน ฉันได้ลองห่อ. profile ในบางสิ่งเช่นนี้แล้ว:
if [ -n $BASH_VERSION ]; then
# the rest of my .profile as above
fi
การ-n
ทดสอบควรกลับเป็นจริงเฉพาะในกรณีที่ความยาวของสตริงไม่เป็นศูนย์อย่างไรก็ตามแม้ว่าจะอยู่ในเซสชันด้านบนเมื่อฉันทำงานภายใต้/bin/sh -l
มันจะส่งคืนสตริงว่างสำหรับ $ BASH_VERSION เมื่อรวมอยู่ใน. profile ของฉันเช่นนี้ มันผ่านการทดสอบ! พวกเขาดำเนินไปยังแหล่ง. bashrc ของฉันและให้ข้อผิดพลาดเหมือนเดิมกับฉัน
ตอนนี้ฉันสับสนจริงๆ
$SHELL
เป็นสิ่งที่เขตข้อมูลสุดท้ายใน/etc/passwd
(หรือgetent passwd
) พูดว่า
~/.profile
ทุบตีสิ่งที่เฉพาะเจาะจงในการทุบตี~/.bashrc
และมี~/.bash_profile
แหล่งที่มาทั้งสอง
dash -l
นอกจากนี้ยังแสดงให้เห็นว่ามีความคุ้มค่า$SHELL
/bin/bash