Bash не читает .bashrc, если не запущен вручную

22

bashне будет исходить .bashrcиз интерактивного терминала, если я не запускаю вручную bashиз терминала:

$ bash

или введите его вручную:

$ source ./.bashrc

или работает:

$ st -e bash

Вот некоторые полезные результаты, я надеюсь:

$ echo $TERM
st-256color

$ echo $SHELL
/bin/sh

$ readlink /bin/sh
bash

$ shopt login_shell
login_shell     off

Я на CRUX Linux 3.0 и я использую dwmи st. Я пытался использовать .bash_profileи .profileбезуспешно.

Любые идеи?

поспешность
источник

Ответы:

19

Зачем это источник? Вы не работаете правдой bash:

$ echo $SHELL
/bin/sh

В большинстве современных систем shэто символическая ссылка на базовую оболочку. На моем Debian например:

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Aug  1  2012 /bin/sh -> dash

В твоем случае, sh это ссылка на bashно, как объяснено в man bash:

Если bash вызывается с именем sh, он пытается максимально близко имитировать поведение при запуске исторических версий sh, при этом также соответствует стандарту POSIX. [...] Когда вызывается как интерактивная оболочка с именем sh, bash ищет переменную ENV, расширяет ее значение, если оно определено, и использует расширенное значение в качестве имени файла для чтения и выполнения. поскольку оболочка, вызываемая как sh, не пытается читать и выполнять команды из любых других файлов запуска , опция --rcfile не действует.

а также

--norc
Не читать и не выполнять общесистемный файл инициализации /etc/bash.bashrc и личный файл инициализации ~ / .bashrc, если оболочка является интерактивной. Эта опция включена по умолчанию, если оболочка вызывается как sh.

Таким образом, так как используемая по умолчанию оболочка sh, .bashrcне читается. Просто установите оболочку по умолчанию на bash, используя chsh -s /bin/bash.

terdon
источник
Спасибо. Я предположил, что это не имеет значения, так как /bin/shуказал /bin/bash. Я предполагаю, что эта проблема возникла из-за того, что я не назначил оболочку явно /bin/bashпри первоначальном создании учетной записи пользователя.
спешка
Кроме того, Debian / Ubuntu переключились dashна работу /bin/shв рамках усилий по сокращению времени запуска. Это было весело, когда мои пользователи начали спрашивать, почему их оболочка действовала по-другому.
Куртм
18

В .bash_profile убедитесь, что у вас есть следующее:

# .bash_profile

# If .bash_profile exists, bash doesn't read .profile
if [[ -f ~/.profile ]]; then
  . ~/.profile
fi

# If the shell is interactive and .bashrc exists, get the aliases and functions
if [[ $- == *i* && -f ~/.bashrc ]]; then
    . ~/.bashrc
fi
Jeight
источник
1
@terdon Ваш ответ правильный. Мой ответ будет действительным, только если он бежит bash. Хороший улов, я пропустил это.
Джайт
Это может вызвать у вас несколько головных болей, если вы работаете bashвместе с другой оболочкой, например, ksh93которая использует .profileпо умолчанию.
Кусалананда
Если ~ / .bash_profile не существует, вы можете его создать.
Пратик
.bashrc в ОС на основе Debain, .bash_profile в CentOS / Fedora / Mac OS
Mitoxys