`export PS1='value'` не распространяется на подоболочки (Korn) для root?

Обратите внимание на следующий файл /root/.profile:

export PS1=value1
export x=value2

Почему оболочка входа в систему показывает ожидаемое приглашение (и $x как значение2), в то время как подоболочки продолжают показывать $x как значение2, а $PS1 как «#»? На всякий случай пробую под OpenBSD.

[Да, я знаю... Какого черта я делаю с OpenBSD, если я этого не знаю? Просто играю... в изолированной, определенно непроизводственной ВМ =).]


person ezequiel-garzon    schedule 02.01.2011    source источник


Ответы (3)


Потому что ваши подоболочки получают что-то, что сбрасывает PS1.

Чтобы отладить это, попробуйте ksh -x. Если это не поможет, попробуйте запустить ksh в strace или эквивалентном инструменте отслеживания системных вызовов. .

person Laurence Gonsalves    schedule 02.01.2011
comment
Спасибо за ответ. Поскольку .profile состоит только из этих двух строк, а .kshrc вообще отсутствует в /root, есть ли у вас какие-либо идеи относительно того, где и когда может иметь место этот источник? - person ezequiel-garzon; 03.01.2011
comment
@ user319845 А добавил в ответ несколько советов по отладке. - person Laurence Gonsalves; 03.01.2011

Проверьте следующие файлы на наличие мошеннических назначений PS1.

   /etc/profile
          The  system  wide initialization file, executed for login shells.
   $HOME/.profile
          The personal initialization  file,  executed  for  login  shells
          after /etc/profile.
   $HOME/..kshrc
          Default  personal  initialization file, executed for interactive
          shells when ENV is not set.
   /etc/suid_profile
          Alternative initialization file, executed when instead  of  per-
          sonal  initialization  file  when the real and effective user or
          group id do not match.

На этой странице руководства может быть опечатка, вероятно, это означало: $HOME/.kshrc

person DigitalRoss    schedule 02.01.2011
comment
Спасибо! К сожалению, /etc/profile, /root/.kshrc и /etc/suid_profile вообще не существуют, так что не повезло. Я никогда не думал, что PS может быть таким загадочным! - person ezequiel-garzon; 03.01.2011

Если кому-то интересно, кто-нибудь, наконец, объяснил это в списке рассылки OpenBSD. Такое поведение ожидаемо в OpenBSD, как объясняется в комментарии внутри /usr/src/bin/ksh/main.c:

safe_prompt = ksheuid ? "$ " : "# ";
{
    struct tbl *vp = global("PS1");

    /* Set PS1 if it isn't set, or we are root and prompt doesn't
     * contain a # or \$ (only in ksh mode).
     */
    if (!(vp->flag & ISSET) ||
        (!ksheuid && !strchr(str_val(vp), '#') &&
        (Flag(FSH) || !strstr(str_val(vp), "\\$"))))
        /* setstr can't fail here */
        setstr(vp, safe_prompt, KSH_RETURN_ERROR);
}
person ezequiel-garzon    schedule 07.01.2011