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


202

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

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

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

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

>>d54c6b47b:~ romeo$

вместо:

>>bash$

В bash все загружается как должно быть.

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

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

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

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

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


Я думаю , что это очень близко к apple.stackexchange.com/questions/7984/... .
Boehj

@boehj хорошо, это упоминает "не загружается .bashrc", но это об этом.
Яри ​​Кейнянен

Хорошо, извините, если я перепутал вещи здесь.
Boehj

Вам, вероятно, нравится csh(или другой вариант) лучше. Но вы должны знать, что это >>bash$можно изменить :)
vol7ron

Если вы хотите, чтобы команды запускались при загрузке , создайте .profileв своем домашнем каталоге
Kolob Canyon

Ответы:


94

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

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


принял это, потому что у него есть решение (и это был первый из двух почти идентичных постов).
romeovs

37
Вниз проголосовали. Я рекомендую не следовать этому совету. Проблема в том, что Терминал создает оболочки входа в систему, а оболочки входа в Bash только запускают сценарий запуска входа в систему, а не ~/.bashrc. Однако решение состоит не в том, чтобы просто поместить свой .bashrcконтент в файл запуска входа в систему, поскольку эти два файла предназначены для выполнения различных типов настройки. Вместо этого каноническая установка для Bash заключается в том, чтобы ваш ~/.bash_profileисточник ~/.bashrcнаходился в какой-то подходящей точке сценария (обычно последний).
Крис Пейдж

Я не вижу других идентичных постов, это просто говорит, что положил в файл sh
user151019

218

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

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

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

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

Я обычно просто положить вещи , которые я обычно положить в ~/.bashrcк ~/.profile- работает до сих пор , как обаяние.


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

5
Re: «Я обычно просто помещаю вещи, которые я обычно помещаю в ~ / .bashrc, в ~ / .profile»: для максимальной совместимости я рекомендую вам следовать совету Криса Джонсена и размещать все, что вы хотите применить к оболочкам, не входящим в систему. ~ / .bashrc и добавьте «source ~ / .bashrc» в ваш ~ / .bash_profile, чтобы запустить его для оболочек входа в систему. В противном случае он не будет работать для вложенных оболочек, или если Терминал изменится для создания оболочек без входа в систему, или если вы когда-либо будете использовать xterm или другую терминальную программу, которая по умолчанию создает оболочки без регистрации, или если вы захотите использовать такая же настройка на другой ОС.
Крис Пейдж

4
Что касается примечания, в Mac OS X вы должны рассмотреть возможность запуска ~ / .bashrc / etc / bashrc для определения глобального поведения. В частности, в / etc / bashrc есть код для обновления рабочего каталога при каждом запросе, что позволяет терминалу отображать значок прокси, создавать новые терминалы в том же каталоге и восстанавливать рабочий каталог для групп резюме и окон.
Крис Пейдж

Для меня получение .bashrc из .bash_profile не сработало. Но поиск .bashrc / .bash_profile из .profile работал.
Кен Рассел

2
Хороший ответ, но немного дезинформированный. Я считаю , что баш терминальные нагрузки только один из ~/.bash_profile, ~/.profile, ~/.bash_login, никогда не все они. Вы можете запустить простой тест, создав 3 файла. Похоже , что Баш терминал имеет предпочтение ~/.bash_profile> ~/.bash_login> ~/.profile. Если кто-либо из них существует, те, кто менее предпочтителен, пропускаются. Вот почему иногда рекомендуется также источник ~/.profileв ~/.bash_profile.
неврит

25

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

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


1
Это мой подход. Таким образом, я могу поддерживать .bashrc, который работает в обеих системах ... и я могу поместить любые специфичные для Mac вещи или вещи, такие как псевдонимы, которые предназначены только для работы (где я чаще всего использую mac) в моем файле .bash_profile.
Майкл Даррант

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

19

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

  1. Вы используете Linux
  2. Вы используете Mac Os X

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


LINUX

В 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

По умолчанию источники Max 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добыт
smac89

11

Sourcing .profile в .bash_profile сделал это для меня

echo 'source ~/.profile' >> ~/.bash_profile

1
Создание источника .profile в .bash_profile - отличная вещь, но это само по себе не приведет к тому, что .bashrc будет запускаться оболочкой входа в систему. Ваш .profile, должно быть, уже получил .bashrc, что может вызвать проблемы, если вы когда-либо будете использовать оболочку, отличную от bash. Большинство пользователей Mac никогда не будут, но если вы по какой-то причине, помните об этом. :)
Terry N

Чтобы расширить то, что сказал @TerryN: будьте уверены, что источник .bashrcот вас, .bash_profileа не от .profile. .bash_profileявляется специфичным для Bash и должен быть источником двух других.
Крис Пейдж

6

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

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

я добавил

. ~/.profile 

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


+1, такая ситуация была у меня. Я обнаружил, что либо .bash_login, либо .bash_profile будет препятствовать выполнению .profile ... Не знаю, почему bash считает необходимым иметь столько конфликтующих файлов запуска.
RichVel

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

3

Ввод ...

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

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

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

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

 type rvm|head -1

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


2

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

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


когда .profile выполняется при входе в систему, он автоматически выполняет файл .bashrc.
Арун Рана

поэтому .bashrc выполняется косвенно при каждом входе в систему
arun rana

1
bashrc предназначен для не входящих в систему оболочек. bash_profile / bash_login / profile / что бы то ни было для оболочек входа в систему. Это является источником большого количества споров, связанных с тем, что является и не является оболочкой входа в систему (например, сеанс screen / tmux, терминал в среде рабочего стола и т. Д.). Это не обязательно «вторая оболочка». Это вопрос входа в оболочку.
Джейсон Салаз

3
Если вы когда-либо используете оболочку, отличную от Bash, выполнение описанных вами действий может вызвать проблемы. .profile применяется ко всем оболочкам, и .bashrc может содержать язык, который некоторые другие оболочки не понимают. Вместо .profile поместите то, что вы написали в .bash_profile. (Кроме того, первым делом .bash_profile должен быть «source .profile».)
Terry N

1

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

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

И Ubuntu начал читать только ~/.bash_profile, но не ~/.bashrcтак, как должен.

Итак, я только что скопировал свои данные ~/.bash_profileс этим:

mv ~/.bash_profile ~/.bash_profile.bak

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

mv ~/.bashrc ~/.bash_profile

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


0

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

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


-1

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

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

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


-2

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

ln -s .bashrc .bash_profile

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

-2

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.