Tôi đang chạy bản cài đặt Oneiric mới (không phải là bản nâng cấp) trên hai hệ thống khác nhau và chạy vào cùng một tập hợp các vấn đề dường như có liên quan.
Điều khó chịu nhất trong số đó là, khi tôi sử dụng .profile và .bashrc mà tôi đã mang theo từ Mac OS X, đăng nhập vào X qua LightDM sẽ đăng xuất ngay lập tức. Tôi tin rằng điều này được gây ra bởi thực tế là, khi chạy "/ bin / sh", nó hoạt động như / bin / dash, nhưng vẫn có biến $ SHELL được đặt thành / bin / bash.
Phép ngoại suy
Tôi có một số lượng lớn .bashrc
. Bạn có thể thấy nó ở đây nếu bạn muốn, nhưng nội dung của nó có thể không liên quan, ngoài thực tế là nó chứa đầy sự bashism, và thực tế là nó hoạt động không có lỗi bên trong xterm hoặc trên bảng điều khiển ảo.
My .profile
trông như thế này (viết tắt):
case $SHELL in
*bash*)
if [ -f $HOME/.bashrc -a -r $HOME/.bashrc ]; then
. $HOME/.bashrc
fi
;;
esac
Nếu tôi cố đăng nhập vào X qua LightDM, nó sẽ đăng nhập lại ngay lập tức. Tôi gặp lỗi .xsession-errors
liên quan đến .bashrc của tôi trông như thế này (viết tắt):
/home/mrled/.bashrc: 103: [[: not found
[: 103: Linux: unexpected operator
[: 274: -P :: unexpected operator
/home/mrled/.bashrc: 520: complete: not found
Như tôi đã nói, khi tôi chạy bash từ bảng điều khiển ảo, tôi không gặp phải những lỗi này. Hơn nữa, nếu tôi loại bỏ .profile của mình, tôi có thể đăng nhập vào X tốt. (Tôi cũng có thể đăng nhập vào bảng điều khiển ảo và sử dụng startx
để bắt đầu phiên X hoạt động, nhưng tất nhiên đây không phải là giải pháp lâu dài.)
Tuy nhiên, tôi phát hiện ra rằng nếu tôi chạy /bin/sh -l
, tôi sẽ gặp lỗi. Đây là một phiên ví dụ (lưu ý: dấu nhắc bash tôi đã đơn giản hóa bash>
và dấu nhắc sh chỉ là $
):
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: Tại sao điều này xảy ra?
Tôi hiểu rằng / bin / sh bây giờ trỏ đến dấu gạch ngang thay vì bash , nhưng nếu đó là sự thật, thì tại sao $SHELL
vẫn quay trở lại /bin/bash
?
Q2: Tôi có thể làm gì để giải quyết nó?
Có cách nào để làm việc này? Tôi muốn giữ hồ sơ của mình tải .bashrc để tôi có được môi trường giống nhau trên cả vỏ đăng nhập và không đăng nhập, nhưng rõ ràng tôi chỉ muốn nó tải cho bash, chứ không phải / bin / sh giả mạo như bash.
Bạn có thể nhận thấy sự khác biệt trong nội dung của các biến $ BASH_VERSION ở trên. Tôi đã thử gói .profile của mình vào một cái gì đó như thế này:
if [ -n $BASH_VERSION ]; then
# the rest of my .profile as above
fi
Tuy nhiên, -n
kiểm tra chỉ trả về đúng nếu độ dài của chuỗi khác không, tuy nhiên, mặc dù trong phiên ở trên, khi tôi chạy dưới /bin/sh -l
nó sẽ trả về một chuỗi trống cho $ BASH_VERSION, khi nó được bao gồm trong .profile của tôi như thế này , nó vượt qua bài kiểm tra! Họ tiến hành tìm nguồn .bashrc của tôi và đưa ra các lỗi giống như trước đây.
Bây giờ tôi thực sự bối rối.
$SHELL
là bất cứ điều gì lĩnh vực cuối cùng trong /etc/passwd
(hoặc getent passwd
) nói.
~/.profile
bash, những thứ dành riêng cho bash ~/.bashrc
và có ~/.bash_profile
cả nguồn.
dash -l
cũng cho thấy$SHELL
có giá trị/bin/bash
.