Я запускаю новую установку 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 теперь указывает на тире, а не на bash , но если это правда, то почему $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 и выдает мне те же ошибки, что и раньше.
Теперь я действительно запутался.
источник
dash -l
также показывает$SHELL
наличие значения/bin/bash
.$SHELL
это то, что говорит последнее поле в/etc/passwd
(илиgetent passwd
).~/.profile
, не относящуюся к bash, в вещи, относящиеся к bash~/.bashrc
, и иметь~/.bash_profile
источник обоих.Ответы:
Вы можете сделать тот факт, что
$BASH_VERSION
пуст вdash
работе для вас:источник
if [ "$BASH_VERSION" = '' ]
-n
, или ничего . (+1, хотя.= ''
Отлично работает.)Вы просто должны использовать кавычки для переменной,
BASH_VERSION
чтобы использовать-n
источник
[ "$EMPTY_STRING" ]
оценивает false, вам даже не нужно-n
. Вам просто нужно процитировать переменную.Используйте,
/proc/[PID]/cmdline
чтобы увидеть, с чем запускается скрипт, и проверить, что он содержит.$$
Переменный даст нам PID запущенной оболочки. Таким образом, мы можем сделать такой скрипт,Вот тест того же скрипта:
источник
bash
в своем названии; нередкоbash
запуск исполняемого файла осуществляется по символической ссылке с другим именем. Обычно все-таки хочется рассмотреть этот Баш. Кроме того , картина соответствует где - нибудь в/proc/$$/cmdline
, что должно быть возможно исправить, но имейте в виду , что аргументы вcmdline
нуль-символ разграничены.grep -qE '(^|/)bash$'
кажется, что это должно работать, но дает ложный положительный результат, когда любой аргументbash
.