Как мой сценарий может определить, выполняется ли он через bash или dash?

Я запускаю свежую установку 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

$

В1: Почему это происходит?

Я понимаю, что / 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 должен возвращать true только в том случае, если длина строки не равна нулю, хотя, хотя и в предыдущем сеансе, когда я работаю в /bin/sh -l, он возвращает пустую строку для $ BASH_VERSION, когда он включается в мой .profile, как это, он проходит тест! Он продолжает исходить из моего .bashrc и выдает мне те же ошибки, что и раньше.

Теперь я действительно в замешательстве.

13
задан 22 January 2012 в 13:52

3 ответа

Можно сделать то, которое $BASH_VERSION пробел в dash работа для Вас:

if [ "$BASH_VERSION" = '' ]; then
    echo "This is dash."
else
    echo "This is bash."
fi
12
ответ дан 22 January 2012 в 13:52

Просто необходимо использовать кавычки на переменной BASH_VERSION для использования -n

if [ -n "$BASH_VERSION" ];then
 echo "this is bash"; 
else 
 echo "this is dash";
fi
5
ответ дан 22 January 2012 в 13:52

Использовать /proc/[PID]/cmdline видеть то, что скрипт запускается с и тест для того, что он содержит. $$ переменная даст нам PID рабочей оболочки. Таким образом мы можем сделать сценарий как это,

#!/bin/bash
if grep -q 'bash' /proc/$$/cmdline ;
then
    echo "This is bash"
else
    echo "This is some other shell"
fi

Вот тест того же сценария:

$> bash test_script.sh                                                                                                
This is bash
$> dash test_script.sh                                                                                                
This is some other shell
2
ответ дан 23 January 2012 в 00:52

Другие вопросы по тегам:

Похожие вопросы: