Чому .bashrc не працює автоматично?


202

Я поміщаю кілька .bashrcфайлів псевдонімів у свій файл, щоб вони могли бути завантажені щоразу, коли я відкриваю нове вікно терміналу. Однак цього не відбувається.

Мені потрібно вибрати run script:в Terminal> Preferences> " MyDefaultTheme "> prefpane Shell і додати: source .bashrc && clearщоб він працював ...

Це здається дивним, оскільки багато навчальних посібників говорять лише про те, що потрібно просто додати .bashrcфайл і все добре.

Зауважте, що я не запускаюсь під bashчас використання терміналу, мені подобається інший (за замовчуванням) кращий (не знаю, що це) краще, тому що він показує мені, де я весь час, наприклад:

>>d54c6b47b:~ romeo$

замість:

>>bash$

У баші все завантажено як слід.

Отже, моє запитання полягає в тому, чому мій .bashrcфайл не завантажувався автоматично і чи потрібно було мені додавати щоразу?

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

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

який повинен написати псевдонім моєму .bashrc, і це не працює ...

Зауважте, що я новачок UNIX, тому будьте лагідні.


Я думаю, що це дуже близько до apple.stackexchange.com/questions/7984/… .
boehj

@boehj добре згадує "не завантажую .bashrc", але це про це.
Ярі Кейненен

Добре, вибачте, якщо я тут переплутав речі.
boehj

Вам, мабуть, більше подобається csh(або інший варіант). Але ви повинні знати, що >>bash$можна змінити :)
vol7ron

Якщо ви хочете команди для запуску OnLoad , створити .profileв своєму домашньому каталозі
Колоб Canyon

Відповіді:


94

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

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


прийняв цю, тому що вона має рішення (і це була перша з двох близьких однакових публікацій).
Rromeovs

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

Я не бачу жодної іншої ідентичної публікації, про яку якраз говориться, поміщена у файл sh
Марк

218

Був там зробив те. Що мені стало відомо, OS X не читає .bashrcфайл під час запуску bash. Натомість він читає такі файли (у наступному порядку):

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

Дивіться також інформативний та корисний коментар Кріса Джонсена :

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

Зазвичай я просто кладу речі, в які я зазвичай вкладаюсь - ~/.bashrcдо цього ~/.profileчасу працював як шарм.


38
За замовчуванням Terminal запускає оболонку через /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 run / etc / bashrc, щоб вибрати глобальну поведінку. Зокрема, в / etc / bashrc є код для оновлення робочого каталогу при кожному запиті, саме це дозволяє Terminal відображати піктограму проксі, створювати нові термінали в тому самому каталозі та відновлювати робочий каталог для Resume and Window Groups.
Кріс Пейдж

Для мене пошук .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оскільки ви використовуєте його в специфічному для Баша способі. Або введіть загальний код .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є файл і чи він друкує відповідно stdout. Я завжди посилаюся на це також для більш простого нагляду та швидкого посилання: 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є специфічним для Баша, і він повинен створити два інших.
Кріс Пейдж

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 не працювало для встановленої програми Terminal.

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

Після цього запуск нового терміналу показує бажаний результат під час введення

 type rvm|head -1

тобто "rvm - це функція". Це не було, поки я не внесла ці зміни, і це єдина зміна, яку я вніс після змін .bash_profileта .bashrcописаних в інших відповідях тут.


2

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

Тому я рекомендую вам написати . ~/.bashrcкоманду у свій ~/.profileфайл, і ця команда буде виконувати файл bashrc кожного разу при вході в систему.


коли .profile виконується при вході в систему, він автоматично виконує файл .bashrc.
arun rana

тому .bashrc виконується непрямо при кожному вході в систему
arun rana

1
bashrc призначений для оболонок без входу. bash_profile / bash_login / profile / все інше для оболонок для входу. Це джерело великої кількості суперечок, що включає в себе те, що є, а не оболонка входу (наприклад, сеанс екрана / tmux, наприклад, термінал у середовищі робочого столу тощо). Це не обов'язково "друга оболонка". Це питання введення оболонки.
Джейсон Салаз

3
Якщо ви коли-небудь використовуєте оболонку, яка не є Bash, виконання описаного вами може спричинити проблеми. .profile застосовується до всіх оболонок, а .bashrc може містити мову, яку деякі інші оболонки не розуміють. Замість .profile введіть те, що ви написали .bash_profile. (Також переконайтесь, що .bash_profile дійсно є "джерелом .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 системах. Ви можете додати: псевдонім ls = "ls -G" у верхню частину цього файлу, і це добре, всі матимуть кольорові файли та папки в системі, тому вам не доведеться встановлювати нічого додаткового для кожного окремого користувача. Ви також помітите разом із "sudo su -", щоб викорінити себе, у вас все одно будуть кольорові файли та папки без зайвих головних болів.

Ще одна забавна порада: використовуючи Icm2 mac, імпорт кольорових профілів одразу надасть забарвлення файлів і папок відповідно до вашої колірної схеми після встановлення цього параметра "/ etc / bashrc".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.