Я запускаю свіжу установку Oneiric (тобто не оновлення) на дві різні системи і стикаюся з тим самим набором, здавалося б, пов'язаних проблем.
Найбільш засмучує купу, що коли я використовую .profile та .bashrc, які я переніс із собою з Mac OS X, вхід у систему X через LightDM вимикає мене негайно. Я вважаю, що це викликано тим, що під час запуску "/ bin / sh" він поводиться як / bin / dash, але все ще має змінну $ SHELL, встановлену на / bin / bash.
Екстраполяція
У мене величезна .bashrc
. Ви можете бачити його тут, якщо хочете, але його вміст, мабуть, не має значення, окрім того, що він повний башизмів, і того, що він працює без помилок усередині 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, яку я спростив bash>
, і підказка sh просто $
):
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, щоб я отримував однакове середовище як оболонок для входу, так і не вхідних даних, але очевидно, що я хочу лише завантажувати себе на bash, а не / bin / sh маскуватися під bash.
Можливо, ви помітили різницю у вмісті змінних $ 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
, специфічні для bash речі ~/.bashrc
, і мати ~/.bash_profile
джерело обох.
dash -l
також показано, що$SHELL
має значення/bin/bash
.