Почему .bashrc не запускается автоматически?

Я поместил в свой .bashrcфайл несколько псевдонимов команд, чтобы они могли загружаться каждый раз, когда я открываю новое окно терминала. Но этого не происходит.

Мне нужно выбрать run script:в Терминале> Настройки> « MyDefaultTheme »> Предварительная панель оболочки и добавить: source .bashrc && clearчтобы он работал...

Это кажется странным, так как во многих учебниках говорится, что вам просто нужно добавить в .bashrcфайл, и все в порядке.

Обратите внимание, что я не запускаю bashпри использовании терминала, мне больше нравится другой (по умолчанию) (не знаю, что это такое), потому что он показывает мне, где я все время, например:

>>d54c6b47b:~ romeo$

вместо:

>>bash$

В bash все грузится как положено.

Итак, мой вопрос: почему мой .bashrcфайл не загружался автоматически, и мне нужно было добавлять возможность вызывать его каждый раз?

Также в каком-то учебнике мне сказали сделать что-то вроде:

$alias la=’ls -la’ >> ~/.bashrc

который должен написать псевдоним для моего .bashrc, это тоже не работает...

Обратите внимание, что я новичок в UNIX, так что будьте осторожны.

Я думаю, что это очень близко к apple.stackexchange.com/questions/7984/… .
Если вместо этого вы используете zshоболочку по умолчанию (не ie bash:), настроенную в OS X 2019+ (в настоящее время Catalina), см. apple.stackexchange.com/a/338622/192005 .
@mmmmmm Я откатил ваше редактирование. Вопрос явно о bash, и даже есть несколько недавних ответов, указывающих, что zsh работает по-другому.
@nohillside эти ответы - вот почему я редактировал. По сути, каталина делает ответы, получившие наибольшее количество голосов, неправильными, но только для каталины. Т.е. правильный ответ скорее зависит от ОС и мы часто спрашиваем какая ОС. Также мы можем видеть, что речь идет о bash, но новые ответы показывают, что это видно о сценариях запуска и о том, где устанавливать псевдонимы в macos, а не о том, какая оболочка используется.
@mmmmmm Ответ зависит от используемой оболочки, а не непосредственно от ОС. Я согласен, что не все будут знать об этом, но ИМХО новый вопрос, связанный с этим и утверждающий, что «это не сработало», было бы лучше. Новые ответы здесь в основном говорят: «Может быть, вы не используете bash, попробуйте zsh».
@mmmmmm Или вы задаете новый вопрос «какие профили используются какими оболочками», самостоятельный ответ для bash и zsh, и мы закрываем его как дубликат
В ответе Каковы функциональные различия между .profile .bash_profile и .bashrc . Ошибка сервера упомянула, почему macOS ведет себя по-разному.

Ответы (13)

Просто поместите это в свой .profileфайл из домашнего каталога, и он должен работать при следующем запуске новой оболочки или после запуска.source ~/.profile

В этой ссылке четко указан порядок, в котором файлы запуска считываются и загружаются оболочкой: http://hayne.net/MacDev/Notes/unixFAQ.html#shellStartup

принял этот, потому что у него есть решение (и это был первый из двух почти идентичных постов).
Проголосовали против. Я рекомендую не следовать этому совету. Проблема в том, что Терминал создает оболочки входа в систему, а оболочки входа Bash запускают только сценарий запуска входа, а не файлы ~/.bashrc. Однако решение состоит не в том, чтобы просто поместить ваш .bashrcконтент в файл запуска входа в систему, потому что эти два файла предназначены для выполнения разных типов настройки. Вместо этого каноническая настройка для Bash заключается в том, чтобы ваш ~/.bash_profileисходный код ~/.bashrcнаходился в какой-то подходящей точке сценария (обычно в конце).
Я не вижу другого идентичного сообщения, это просто говорит о том, что нужно добавить файл sh
Если вместо этого вы используете zshоболочку по умолчанию (не ie bash:), настроенную в OS X 2019+ (в настоящее время Catalina), см. apple.stackexchange.com/a/338622/192005 .

Был там, сделал это. Что мне стало известно, OS X не читает .bashrcфайл при запуске bash. Вместо этого он читает следующие файлы (в следующем порядке):

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

См. также информативный и полезный комментарий Криса Джонсена :

По умолчанию Терминал запускает оболочку через /usr/bin/login, что делает ее оболочкой входа в систему. На каждой платформе (не только Mac OS X) bash не использует .bashrcоболочки для входа в систему (только /etc/profileи первый из .bash_profileсуществующих .bash_loginи доступных для .profileчтения). Вот почему "вставь source ~/.bashrcсвой .bash_profile" - это стандартный совет.

Обычно я просто ставлю то, что обычно вставляю — ~/.bashrcдо ~/.profileсих пор срабатывало как волшебство.

По умолчанию Терминал запускает оболочку через /usr/bin/login, что делает ее оболочкой входа в систему. На каждой платформе (не только Mac OS X) bash не использует .bashrcоболочки для входа в систему (только /etc/profileи первый из .bash_profileсуществующих .bash_loginи доступных для .profileчтения). Вот почему «вставь source ~/.bashrcсвой .bash_profile» — это стандартный совет.
Re «Обычно я просто помещаю то, что обычно помещаю в ~/.bashrc, в ~/.profile»: для максимальной совместимости я рекомендую вам последовать совету Криса Джонсена и поместить все, что вы хотите применить к оболочкам без входа в систему, в ~/.bashrc и добавьте «source ~/.bashrc» в свой ~/.bash_profile, чтобы запускать его для оболочек входа в систему. В противном случае он не будет работать для вложенных оболочек, или если Терминал изменится для создания оболочек без входа в систему, или если вы когда-либо использовали xterm или другую программу терминала, которая по умолчанию создает оболочки без входа, или если вы захотите использовать такая же настройка на другой ОС.
В связи с этим в Mac OS X вам следует рассмотреть возможность запуска ~/.bashrc /etc/bashrc для определения глобального поведения. В частности, в /etc/bashrc есть код для обновления рабочего каталога при каждом запросе, что позволяет терминалу отображать значок прокси, создавать новые терминалы в том же каталоге и восстанавливать рабочий каталог для возобновления и групп окон.
Для меня получение .bashrc из .bash_profile не сработало. Но поиск .bashrc/.bash_profile из .profile сработал.
Проголосуйте за «Вот почему «поместить исходный код ~/.bashrc в ваш .bash_profile» является стандартным советом»
~/.profile работает на iOS!
@RajkumarMasaniayan, вы используете оболочку, отличную от Bash? Что echo $SHELLвыводит?
Хороший ответ, но немного дезинформированный. Я считаю, что терминал bash загружает только один из них ~/.bash_profile, а не все. Вы можете запустить простой тест, создав 3 файла. Похоже, что терминал bash имеет предпочтение > > . Если какой-либо из них существует, менее предпочтительные пропускаются. Вот почему иногда рекомендуется также использовать исходный код в формате . ~/.profile~/.bash_login~/.bash_profile~/.bash_login~/.profile~/.profile~/.bash_profile
на Эль-Капитане мне все еще нужно найти свой .bashrcили .bash_profileсначала использовать псевдоним, который я установил, я не знаю, где разместить свой псевдоним, чтобы он оставался постоянным каждый раз, когда я открываю новый терминал
В моем случае ~/.profile не читался, потому что у меня был ~/.bash_profile.
Если вместо этого вы используете zshоболочку по умолчанию (не ie bash:), настроенную в OS X 2019+ (в настоящее время Catalina), см. apple.stackexchange.com/a/338622/192005 .
Не могли бы вы пояснить вывод? Ваша цитата гласит: Вот почему «поместите исходный код ~/.bashrcв свой .bash_profile» является стандартным советом , а вы говорите: поместите ~/.bashrcв~/.profile . Вы оба рекомендуете? FWIW это сработало для меня только тогда, когда я получил файл ~/.profile.
@Honey Этот ответ, кажется, предполагает «либо». (Тем не менее, ваш подход лучше ИМО.)
Это правильный ответ и для Ubuntu.

Я помещал все в ~/.bashrcи только source ~/.bashrcв .profile.

Это позволяет сеансам экрана и xterm (и, я думаю, tmux) наследовать мою среду, поскольку сеансы без входа в систему выполняются только .bashrc, тогда как сеансы входа (например, терминал или iTerm) выполняются только .profile.

Это мой подход. Таким образом, я могу поддерживать .bashrc, который работает в обеих системах... и я могу помещать любые вещи, специфичные для Mac, или такие вещи, как псевдонимы, которые предназначены только для работы (где я чаще всего использую Mac) в моем файле .bash_profile.
Обратите внимание, что .profileэто общее для нескольких оболочек и должно содержать только POSIX-совместимый код sh. Если он исходит .bashrc, он, возможно, содержит код, специфичный для Bash (существование .bashrcфайла зависит от Bash). Я рекомендую переименовать ваш .profileв, .bash_profileтак как вы используете его специфичным для Bash способом. Или поместите общий код .profileи создайте .bash_profileисходный код .profileи файлы .bashrc.

Есть два сценария:

  1. Вы используете линукс
  2. Вы используете Mac OS X

Для обоих вы хотите использовать источник ~/.bashrcв своем профиле, который загружается или загружается при запуске вашей оболочки для вашего терминала.


ЛИНУКС

В Linux ~/.profileавтоматически создается исходный код в вашей оболочке при запуске. Итак, если вы перейдете к своему терминалу и наберете cd ~; ls -A, вы увидите все свои файлы и каталоги в своем домашнем каталоге ( /home/usrname/). Вы должны увидеть файл с именем .profile. Это файл, который автоматически загружается при запуске терминала.

Если вы хотите добавить псевдонимы и функции ~/.bashrc(что я и делаю), вам следует (внутри ~/.profileдобавить оператор if, который проверяет, ~/.bashrcявляется ли файл непустым, а затем исходить его.

Чтобы проверить, делаете ли вы ~/.profileэто уже, введите nano ~/.profile. Это откроет его в текстовом редакторе (вы можете использовать gedit, если знаете, что он у вас есть, или даже vim, если знаете, как им пользоваться). Вы можете получить пустой текстовый файл (вы не должны), но если вы это сделаете, просто продолжите. Если вы нигде не видите строку с надписью source ~/.bashrc, введите где-нибудь следующие строки (поместите их в разумное место, например, в конец или начало, а не в середину оператора if):

if [ -s ~/.bashrc ]; then
    source ~/.bashrc;
fi

Это проверяет, ~/.bashrcявляется ли файл непустым (с помощью if [ -s ~/.bashrc ]), и если это так, он создает его. Довольно просто. Теперь вы можете добавить любой допустимый псевдоним, функцию, переменную и т. д. в файл ~/.bashrc.


MAC OS X

По умолчанию (до Catalina 2019) источники Mac OS X ~/.bash_profile. Чтобы иметь возможность что-то добавлять ~/.bashrc(что, опять же, я делаю и в OS X), вы следуете той же процедуре, что и в Linux. В терминале введите cd ~; nano .bash_profile. Найдите строку, в которой говорится, source ~/.bashrcи если ее нет, добавьте оператор if выше ( if [ -s ~/.bashrc ]; then source ~/.bashrc; fi).


ПРИМЕЧАНИЯ

При написании оператора if обязательно оставляйте пробелы между практически всем (например if [ -s ~/.bashrc]; then echo "found"; fi, не работает, потому что нет пробела между ~/.bashrcи ]- интерпретатор будет думать, что это одно слово).

Если вы хотите выяснить, как лучше проверять содержимое оператора if, перейдите в терминал и введите man \[; это, по сути, дает вам изложение оператора if. Например, if [ -f /path/to/file ]; then echo "it's a file"; else echo "not a file"; fiпроверяет, /path/to/fileявляется ли файл файлом и, соответственно, выводит его на стандартный вывод. Я также всегда ссылаюсь на это для облегчения восприятия и быстрой справки: 7.2. Операторы проверки файлов .

Надеюсь, это поможет. Я помню, в каком замешательстве я был, когда начал все это (что было не так давно); так что удачи вам в ваших будущих начинаниях с UNIX!

В Linux .profileисточник только в том случае, если ваша оболочка является оболочкой входа в систему, в противном случае .bashrcисточник
Если вместо этого вы используете zshоболочку по умолчанию (не ie bash:), настроенную в OS X 2019+ (в настоящее время Catalina), см. apple.stackexchange.com/a/338622/192005 .

Кстати, если у вас активирован ZSH, он заменяет bash!

Поэтому все эти ~/.bashrcфайлы не загружаются.

~/.zshrcВместо этого вы должны установить свои псевдонимы .

Спасибо! Я не знаю, почему у этого есть отрицательный голос. Все остальное у меня не работало, и я не думал, что проблема в ZSH.
Спасибо! Это было 100% проблемой для меня.
А в 2019+ Mac OS X (в настоящее время Catalina) zshэто оболочка по умолчанию (активация не требуется) (вместо bash) ;)
тнк :) 01234567
мой мужчина..........
2022, ооо, чувак!

Поиск .profile в .bash_profile сделал это за меня

echo 'source ~/.profile' >> ~/.bash_profile
Поиск .profile в .bash_profile — отличная вещь, но само по себе это не приведет к запуску .bashrc оболочками входа в систему. В вашем .profile уже должен быть источник .bashrc, что может вызвать проблемы, если вы когда-либо будете использовать оболочку, отличную от bash. Большинство пользователей Mac никогда этого не сделают, но если вы по какой-то причине это сделаете, помните об этом. :)
Чтобы расширить то, что сказал @TerryN: обязательно используйте источник .bashrcиз вашего, .bash_profileа не из .profile. .bash_profileспецифичен для Bash и должен быть источником двух других.
В версии 2019+ (устанавливается Mac OS X Caltalina) оболочка по умолчанию — zsh. Он не создает исходные .bash*файлы автоматически и начинается с .profile.
Да, osX Catalina по умолчанию zsh— но @ingyhere, вы уверены, что поиск начинается с ~/.profile? В моем случае (на моей Catalina) казалось, что это не так, и вместо этого я успешно использовал только ~/.zshrc(согласно apple.stackexchange.com/a/338622/192005 ).
@cellepo Я думаю, это зависит от того, есть ли файл ~/.zprofile. Этот ответ цитирует заказ из документов для zsh. Кроме того, ~/.profileкажется, что он загружается рядом оболочек, поэтому он выглядит более универсальным.

Я обнаружил, что после установки rvm (автоматический установщик, никаких правок вручную) он создал ~/.bash_loginдля себя файл, которого раньше у меня никогда не было.

Однако это означает, что мои ~/.profileнастройки и псевдонимы больше не загружаются! Многие ярлыки исчезли. Я думал, что они работают последовательно, а не исключительно :-/

я добавил

. ~/.profile 

чтобы ~/.bash_loginсвязать вещи, как я ожидал.

+1, у меня была такая ситуация. Я обнаружил, что либо .bash_login, либо .bash_profile предотвратят выполнение .profile... Не знаю, почему bash считает необходимым иметь так много конфликтующих файлов запуска.
.profileявляется общим для нескольких разных оболочек и должен содержать только POSIX-совместимый код sh. .bash_profileспецифичен для Bash и может содержать код, специфичный для Bash. В общем, если вы используете Bash, вы должны предпочесть, .bash_profileесли вы не будете осторожны, чтобы убедиться, что ваш код запуска не содержит ничего, что зависит от Bash. Какая бы программа ни была создана .bash_login, вероятно, это произошло потому, что она содержит код, специфичный для Bash, но она должна была включать код в исходный код, .profileесли он существует.

Положить...

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

... in ~/.bashrc, а затем источник ~/.bashrcв my ~/.bash_profileне работал для установленной программы Terminal.

Но затем я перешел к раскрывающемуся меню « Правка»> «Настройки профиля » , вкладка « Заголовок и команда » и выбрал команду «Выполнить» в качестве оболочки входа в раздел команд на этой странице.

После этого запуск нового терминала показывает желаемый результат, когда я набираю

 type rvm|head -1

т.е. "rvm - это функция". Этого не было, пока я не внес это изменение, и это единственное изменение, которое я сделал после изменений .bash_profileи .bashrc, описанных в других ответах здесь.

Прежде всего позвольте мне сказать вам, что ~/.bashrcэто файл, который выполняется каждый раз, когда вызывается вторая оболочка (например, при запуске сценария оболочки), и ~/.profileвызывается при каждом входе в систему.

Поэтому я рекомендую вам написать . ~/.bashrcкоманду в вашем ~/.profileфайле, и эта команда будет выполнять файл bashrc каждый раз, когда вы входите в систему.

когда .profile запускается при входе в систему, он автоматически запускает файл .bashrc.
поэтому .bashrc выполняется косвенно при каждом входе в систему
bashrc предназначен для оболочек без входа в систему. bash_profile/bash_login/profile/что угодно еще для оболочек входа в систему. Это источник огромного количества споров, касающихся того, что является оболочкой входа в систему, а что нет (например, сеанс screen/tmux, терминал в среде рабочего стола и т. д.). Это не обязательно «вторая оболочка». Это вопрос входа в оболочку.
Если вы когда-нибудь будете использовать оболочку, отличную от Bash, выполнение того, что вы описываете, может вызвать у вас проблемы. .profile применяется ко всем оболочкам, а .bashrc может содержать язык, который некоторые другие оболочки не понимают. Вместо .profile поместите то, что вы написали, в .bash_profile. (Кроме того, сначала сделайте .bash_profile «исходным .profile».)

Я столкнулся с той же проблемой после установки rbenv на моем удаленном сервере (Digital Ocean) Ubuntu 16.04.

Как-то создал ~/.bash_profile. То же самое ~/.bashrcи в системе OS X.

А убунту начал только читать ~/.bash_profile, но не ~/.bashrcтак как надо.

Поэтому я просто сделал резервную копию своих данных ~/.bash_profileс помощью этого:

mv ~/.bash_profile ~/.bash_profile.bak

И переименовал старый ~/.bashrcв~/.bash_profile

mv ~/.bashrc ~/.bash_profile

Это сработало для меня. После моего входа в систему по ssh у меня все загружается в ~/.bashrc.

В случае, если это может помочь кому-то еще...

Убедитесь, что вы редактируете правильный .bashrcфайл для правильного пользователя. У меня была аналогичная проблема с использованием Vagrant. После запуска vagrant sshмой .bashrcфайл не запускался. Решение было простым: я думал, что vagrant входит в систему с пользователем с именем vagrant, а на самом деле я входил в систему как другой пользователь. Значит, я редактировал не тот .bashrcфайл. После редактирования правильного .bashrcфайла мои псевдонимы были распознаны.

Чтобы сохранить вход в систему в стиле OSX .profileи поддерживать нормальное поведение bash .bashrc, вы можете использовать .bashrcфайл, если вы переключаетесь между обычным nix и OSX, предоставляя символическую ссылку на ваш .bashrcфайл с именем .bash_profile. Просто убедитесь, что этот файл еще не существует, прежде чем пытаться это сделать, но я делаю это так.

ln -s .bashrc .bash_profile
Выполняя эту связь между двумя разными сценариями инициализации оболочки, вы теряете необходимое разделение функций. Рано или поздно вам понадобится инициализация на уровне сеанса ( .bash_profile) и инициализация на каждом уровне оболочки ( .bashrc).

/etc/bashrc предназначен для глобальных профилей в системах Mac. Вы можете добавить: alias ls="ls -G" в начало этого файла, и все будет хорошо, у всех будут раскрашенные файлы и папки в системе, поэтому вам не придется устанавливать ничего дополнительно для каждого отдельного пользователя. Вы также заметите, что вместе с «sudo su -» для рутирования у вас все равно будут раскрашенные файлы и папки без лишних головных болей.

Еще один забавный совет: при использовании Mac Iterm2 импорт цветовых профилей сразу же отображает цвет файлов и папок в соответствии с вашей цветовой схемой после установки этого параметра «/etc/bashrc».