سؤال الفرق بين .bashrc و .bash_profile


ما الفرق بين .bashrc و .bash_profile وأي واحد يجب أن أستخدمه؟


409
2017-09-02 14:40


الأصل


انظر أيضا هذا السؤال المماثل في ubuntu.stackexchange.com/questions/1528/bashrc-or-bash-profile - Stefan Lasiewski
إذا كنت تريد شرحًا أكثر اكتمالًا يتضمن ذلك أيضًا .profile، إلقاء نظرة على هذا السؤال: superuser.com/questions/789448/... - Flimm
هذه الإجابة تغطي أيضا بعض الجوانب stackoverflow.com/questions/415403/... - Sergey Voronezhskiy


الأجوبة:


تقليديا ، عندما تقوم بتسجيل الدخول إلى نظام Unix ، سيقوم النظام ببدء برنامج واحد لك. هذا البرنامج هو shell ، أي برنامج مصمم لبدء برامج أخرى. إنها shell سطر الأوامر: يمكنك بدء برنامج آخر بكتابة اسمه. shell الافتراضي ، shell Bourne ، يقرأ الأوامر من ~/.profile عندما يتم استدعائها كقاعدة تسجيل الدخول.

باش هو قذيفة تشبه بورن. يقرأ الأوامر من ~/.bash_profile عندما يتم استدعائها كقاعدة تسجيل الدخول ، وإذا كان هذا الملف غير موجود ، فإنه يحاول القراءة ~/.profile في حين أن.

يمكنك استدعاء shell مباشرةً في أي وقت ، على سبيل المثال عن طريق تشغيل محاكي طرفية داخل بيئة واجهة المستخدم الرسومية. إذا لم يكن shell عبارة عن shell تسجيل الدخول ، فإنه لا يقرأ ~/.profile. عند بدء bash كقذيفة تفاعلية (أي عدم تشغيل برنامج نصي) ، فإنه يقرأ ~/.bashrc (باستثناء عندما يتم استدعاؤه كقاعدة تسجيل دخول ، فإنه يقرأ فقط ~/.bash_profile أو ~/.profile.

وبالتالي:

  • ~/.profile هو المكان المناسب لوضع الأشياء التي تنطبق على جلسة العمل بأكملها ، مثل البرامج التي ترغب في بدءها عند تسجيل الدخول (ولكن ليس البرامج الرسومية ، وتذهب إلى ملف مختلف) ، وتعريفات متغير البيئة.

  • ~/.bashrc هو المكان لوضع الأشياء التي تنطبق فقط على bash نفسه ، مثل الاسم المستعار وتعريفات الوظيفة ، وخيارات shell ، وإعدادات المطالبة. (يمكنك أيضًا وضع الارتباطات الرئيسية ، ولكن بالنسبة إلى bash ، فإنها عادةً ما تدخل ~/.inputrc.)

  • ~/.bash_profile يمكن استخدامها بدلا من ~/.profile، ولكن قرأها باش فقط ، وليس بأي قشرة أخرى. (وهذا في الغالب مصدر قلق إذا كنت تريد أن تعمل ملفات التهيئة الخاصة بك على عدة أجهزة وأن قذيفة تسجيل الدخول لا تتعرض لها جميعًا.) هذا مكان منطقي لتضمينه ~/.bashrc إذا كانت قذيفة تفاعلية. أوصي بالمحتويات التالية في ~/.bash_profile:

    if [ -r ~/.profile ]; then . ~/.profile; fi
    case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
    

على الوحدات الحديثة ، هناك تعقيد إضافي متعلق بـ ~/.profile. إذا قمت بتسجيل الدخول في بيئة رسومية (أي إذا كان البرنامج الذي تكتب فيه كلمة المرور الخاصة بك قيد التشغيل في وضع الرسومات) ، فلن تحصل تلقائيًا على shell تسجيل الدخول الذي يقرأ ~/.profile. اعتمادًا على برنامج تسجيل الدخول الرسومي ، أو على مدير النوافذ أو بيئة سطح المكتب ، فإنك تعمل بعد ذلك ، وعلى كيفية تهيئة توزيعك لهذه البرامج ، ~/.profile قد تقرأ أو لا تقرأ. إذا لم يكن الأمر كذلك ، فعادةً ما يكون هناك مكان آخر يمكنك فيه تحديد متغيرات البيئة وبرامج التشغيل عند تسجيل الدخول ، ولكن للأسف لا يوجد موقع قياسي.

لاحظ أنك قد ترى هنا وهناك توصيات إما لوضع تعريفات متغير البيئة في ~/.bashrc أو دائما إطلاق قذائف تسجيل الدخول في المحطات. كلاهما أفكار سيئة. تتمثل المشكلة الأكثر شيوعًا في أي من هذه الأفكار في أن متغيرات البيئة الخاصة بك سيتم تعيينها فقط في البرامج التي يتم تشغيلها عبر الجهاز ، وليس في البرامج التي تبدأ مباشرة مع أيقونة أو قائمة أو اختصار لوحة المفاتيح.

¹  للاكتمال ، حسب الطلب: إذا .bash_profile غير موجود ، باش أيضا يحاول .bash_loginقبل العودة إلى .profile. لا تتردد في نسيانها.  


479
2017-09-02 19:23



+1 للمشاركة الجيدة. كما نشكرك على إضافة قسم حول "تسجيل الدخول إلى رسوم بيانية vs shell shell" ... لقد واجهت مشكلة حيث كنت أعتقد أن / / .profile سوف ينفذ دائمًا لرسومات / shell ... ولكنه لا يتم تنفيذه عندما يسجل المستخدم الدخول عبر تسجيل الدخول الرسومي. شكرا لك على حل هذا اللغز. - Trevor Boyd Smith
Gilles: هل يمكن أن تشرح بمزيد من التفصيل ، مع أمثلة ، لماذا تشغيل shell تسجيل الدخول في كل محطة هو فكرة سيئة؟ هل هذه فقط مشكلة في لينكس سطح المكتب؟ (أجمع ذلك على OS X Terminal يعمل على تسجيل الدخول في كل مرة ، ولم ألاحظ أي آثار جانبية (على الرغم من أنني عادةً ما أستخدم iTerm). ولكن بعد ذلك لا أستطيع التفكير في العديد من متغيرات البيئة التي سأهتم بها خارج محطة طرفية (ربما HTTP_PROXY؟)) - iconoclast
Brandon إذا قمت بتشغيل shell تسجيل الدخول في كل محطة طرفية ، سيؤدي ذلك إلى تجاوز متغيرات البيئة التي توفرها البيئة. في المواقف اليومية ، يمكنك أن تفلت من العقبات ، لكنها ستأتي وتعضك عاجلاً أم آجلاً ، عندما تريد إعداد متغيرات مختلفة في جهاز طرفية (على سبيل المثال ، لتجربة نسخة مختلفة من برنامج): تشغيل تسجيل الدخول من شأنه أن يتجاوز الإعدادات المحلية. - Gilles
البيان ~/.bash_profile يمكن استخدامها بدلا من ~/.profile، ولكن عليك أيضا أن تدرج ~/.bashrc إذا كانت قذيفة تفاعلية. مضلل لأن هذه هي مشاكل متعامدة. لا يهم إذا كنت تستخدم ~/.bash_profile أو ~/.profile عليك أن تدرج ~/.bashrc في الذي تستخدمه إذا كنت تريد أن يكون للإعدادات من هناك تأثير في shell تسجيل الدخول. - Piotr Dobrogost
Gilles بالتأكيد ، ولكن الطريقة التي صيغت بها الجملة في الإجابة تشير إلى أن الحاجة إلى تضمينها ~/.bashrc له علاقة بالاختيار ~/.bash_profile بدلا من ~/.profile وهذا غير صحيح. إذا كان شخص ما يشمل ~/.bashrc في أي نوع من البرامج النصية التي يتم الحصول عليها في وقت تسجيل الدخول (هنا إما ~/.bash_profile أو ~/.profile) لأنه يريد الإعدادات من ~/.bashrc ليتم تطبيقها على shell تسجيل الدخول بنفس الطريقة التي يتم تطبيقها على shell غير تسجيل الدخول. - Piotr Dobrogost


من هذا مقال قصير

وفقا لصفحة رجل باش ،   يتم تنفيذ .bash_profile لتسجيل الدخول   قذائف ، في حين يتم تنفيذ .bashrc ل   قذائف تفاعلية غير تسجيل الدخول.

ما هو تسجيل الدخول أو قذيفة غير تسجيل الدخول؟

عند تسجيل الدخول (على سبيل المثال: اكتب اسم المستخدم و   كلمة المرور) عن طريق وحدة التحكم ، إما   يجلس جسديا في الجهاز عندما   تمهيد ، أو عن بعد عبر ssh:   يتم تنفيذ .bash_profile لتهيئة   الأشياء قبل الأمر الأولي   مستعجل.

ولكن ، إذا قمت بتسجيل الدخول بالفعل   جهازك وفتح محطة جديدة   نافذة (xterm) داخل Gnome أو KDE ،   ثم يتم تنفيذ .bashrc قبل   نافذة الاوامر السريعه - -. .bashrc أيضًا   تشغيل عند بدء نسخة باش جديدة   عن طريق كتابة / bin / bash في جهاز طرفي.


50
2017-09-02 14:54



تحديثات طفيفة: من المحتمل أن يكون "المنفذة" عبارة مضللة بعض الشيء ، كلاهما مصدرها. يتم تنفيذ الأصوات مثل تشغيله كبرنامج نصي ، شوكة / exec yadda yadda. يتم تشغيله في سياق shell الحالي الأهم من ذلك ، يتم تشغيل .bashrc كثيرًا. يتم تشغيله على كل برنامج نصي bash run ، وأيضًا إذا لم يكن لديك ملف bash_profile. أيضا ، اعتمادا على كيفية إعداد xterms الخاص بك ، يمكنك إنشاء shell المصدر .bash_profile - Rich Homolka


مرة أخرى في الأيام القديمة ، عندما لم تكن الزائفة tty زائفة وفي الواقع ، بشكل جيد ، وطباعتها ، وتم الوصول إلى UNIXes بواسطة أجهزة المودم بحيث يمكنك رؤية كل حرف يتم طبعه على شاشتك ، كانت الكفاءة ذات أهمية قصوى. للمساعدة في الكفاءة إلى حد ما كان لديك مفهوم نافذة تسجيل الدخول الرئيسية وأي النوافذ الأخرى التي استخدمتها بالفعل. في نافذتك الرئيسية ، ترغب في تلقي الإشعارات بأي بريد جديد ، وربما تشغيل بعض البرامج الأخرى في الخلفية.

لدعم هذا ، مصدر قذائف ملف .profile على وجه التحديد على "قذائف تسجيل الدخول". هذا من شأنه أن يفعل الخاص ، مرة واحدة في الإعداد للجلسة. مدد باش هذا إلى حد ما للنظر. bash_profile أولاً قبل .profile ، وبهذه الطريقة يمكنك وضع باش فقط الأشياء هناك (حتى لا المسمار بورن شل ، إلخ ، التي بدت أيضا في .profile). سوف قذائف أخرى ، عدم تسجيل الدخول ، مصدر الملف RC ، .bashrc (أو .kshrc ، الخ).

هذا جزء من مفارقة تاريخية الآن. لا تقوم بتسجيل الدخول إلى shell الرئيسي بقدر ما تقوم بتسجيل الدخول إلى مدير نافذة GUI. لا توجد نافذة رئيسية مختلفة عن أي نافذة أخرى.

اقتراحي - لا تقلق بشأن هذا الاختلاف ، فهو يعتمد على أسلوب قديم يستخدم نظام يونيكس. القضاء على الاختلاف في ملفاتك. يجب أن تكون محتويات ملف .bash_profile بالكامل:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

ونضع كل ما تريده بالفعل في .bashrc

تذكر أن .bashrc مصدرًا لجميع الأصداف التفاعلية وغير التفاعلية. يمكنك قصر التدريج على مصادر القذائف غير التفاعلية عن طريق وضع هذا الرمز بالقرب من أعلى .bashrc:

[[ $- != *i* ]] && return


34
2017-09-02 18:10



هذه فكرة سيئة ، انظر إجابتي. على وجه الخصوص ، سيتم فقط تعيين متغيرات البيئة الخاصة بك في البرامج التي يتم تشغيلها عبر الجهاز ، وليس في البرامج التي تبدأ مباشرة مع أيقونة أو قائمة أو اختصار لوحة المفاتيح. - Gilles
Gilles أنا لا أفهم لماذا تدعي هذا. مع .$HOME/.bashrc كما أظهر ريتش أعلاه ، الإعدادات في .bashrc سوف تكون متاحة في قذائف تسجيل الدخول ، وبالتالي بيئة سطح المكتب كذلك. على سبيل المثال ، على نظام فيدورا بلدي ، gnome-session بدأ كما -$SHELL -c gnome-session، وبالتالي .profile يقرأ. - Mikel
PiotrDobrogost أوه ، نعم ، هناك مشكلة أخرى مع إجابة ريتش. بما فيها .bashrc في .profile عادة لا يعمل ، لأن .profile يمكن تنفيذها من قبل /bin/sh وليس bash (على سبيل المثال في Ubuntu لتسجيل الدخول الرسومية افتراضيًا) ، وقد لا تكون هذه shell تفاعلية (على سبيل المثال لتسجيل الدخول الرسومي). - Gilles
Gilles إعادة: "بما في ذلك. bashrc في .profile" ليست على الإطلاق ما كان أوصى (تماما على العكس ، في الواقع). إما أن الجواب تم تحريره (لا يبدو كذلك) ، أو أن تعليقاتك لا تتماشى مع ما يقال. - michael
بوجهٍ عام ، +1 ، ولكنني سأضيف إلى التوصية بـ "دائرة كهربائية قصيرة ... للأصداف غير التفاعلية" ("بالقرب من الجزء العلوي من .bashrc: [[ $- != *i* ]] && return") ؛ أنا أحب بعض من بلدي .bashrc ليتم تنفيذها حتى بالنسبة للأصداف غير التفاعلية ، وتحديدًا لضبط vv env ، عند إصدارها ssh hostname {command}، بحيث يتم تنفيذ الأوامر البعيدة بشكل صحيح (حتى ولو كانت shell غير تفاعلية). لكن الإعدادات الأخرى في وقت لاحق .bashrc يجب تجاهلها. عادة ما أتحقق من TERM = dumb و / أو unset ، ثم ننفذها مبكرًا. - michael


الق نظرة على هذا بلوق وظيفة ممتازة من قبل ShreevatsaR. في ما يلي مقتطف ، ولكن انتقل إلى مشاركة المدونة ، حيث يتضمن شرحًا لعبارات مثل "shell login" ، ومخطط انسيابي ، وجدول مماثل لـ Zsh.

لباش ، فإنها تعمل على النحو التالي. اقرأ أسفل العمود المناسب. ينفذ A ، ثم B ، ثم C ، إلخ. B1 ، B2 ، B3 يعني أنه ينفذ فقط أول هذه الملفات التي تم العثور عليها.

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

14
2017-07-13 08:53



بدلاً من نشر نفس الإجابة على أسئلة متعددة ، يفضل إذا كنت تستطيع تخصيص إجابتك للاحتياجات المحددة للطالب. إذا كانت الإجابة متطابقة تمامًا لكلا السؤالين ، فيجب أن تنشر إجابة واحدة وتصوت على إغلاق الأسئلة الأخرى كنسخ طبق الأصل من النسخة الأصلية. - Mokubai♦
Mokubai لقد تم وضع علامة على السؤال الآخر على أنه نسخة طبق الأصل من هذا السؤال. - Flimm
ElipticalView: عن طريق الإعداد لعدم القيام بشيء ، فأنت تشير إلى الخط: [ -z "$PS1" ] && return؟ الجدول الموجود في جوابي هو إعطاء قائمة البرامج النصية التي يتم تشغيلها بواسطة Bash بغض النظر عن محتويات البرامج النصية ، إذا كان للبرنامج النصي نفسه السطر [ -z "$PS1" ] && returnوبالطبع سيحدث ذلك ، لكنني لا أعتقد أنه ينبغي أن يعني ذلك أنني يجب أن أغير الجدول. - Flimm


تعليق أفضل لرأس / خ / لمحة

بناءً على إجابة Flimm الرائعة أعلاه ، أطلعت على هذا التعليق الجديد على رأس ملفي Debian / etc / ، (قد تحتاج إلى تعديله من أجل التوزيعة الخاصة بك.):

# For BASH: Read down the appropriate column. Executes A, then B, then C, etc.
# The B1, B2, B3 means it executes only the first of those files found.  (A)
# or (B2) means it is normally sourced by (read by and included in) the
# primary file, in this case A or B2.
#
# +---------------------------------+-------+-----+------------+
# |                                 | Interactive | non-Inter. |
# +---------------------------------+-------+-----+------------+
# |                                 | login |    non-login     |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   ALL USERS:                    |       |     |            |
# +---------------------------------+-------+-----+------------+
# |BASH_ENV                         |       |     |     A      | not interactive or login
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile                     |   A   |     |            | set PATH & PS1, & call following:
# +---------------------------------+-------+-----+------------+
# |/etc/bash.bashrc                 |  (A)  |  A  |            | Better PS1 + command-not-found 
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/bash_completion.sh|  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |/etc/profile.d/vte-2.91.sh       |  (A)  |     |            | Virt. Terminal Emulator
# |/etc/profile.d/vte.sh            |  (A)  |     |            |
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# |   A SPECIFIC USER:              |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_profile    (bash only)   |   B1  |     |            | (doesn't currently exist) 
# +---------------------------------+-------+-----+------------+
# |~/.bash_login      (bash only)   |   B2  |     |            | (didn't exist) **
# +---------------------------------+-------+-----+------------+
# |~/.profile         (all shells)  |   B3  |     |            | (doesn't currently exist)
# +---------------------------------+-------+-----+------------+
# |~/.bashrc          (bash only)   |  (B2) |  B  |            | colorizes bash: su=red, other_users=green
# +---------------------------------+-------+-----+------------+
# |                                 |       |     |            |
# +---------------------------------+-------+-----+------------+
# |~/.bash_logout                   |    C  |     |            |
# +---------------------------------+-------+-----+------------+
#
# ** (sources !/.bashrc to colorize login, for when booting into non-gui)

وهذه الملاحظة على رأس كل من ملفات الإعداد الأخرى للإشارة إليها:

# TIP: SEE TABLE in /etc/profile of BASH SETUP FILES AND THEIR LOAD SEQUENCE

الجدير بالذكر هو أن ديبيان / etc / profile حسب المصادر الافتراضية (يتضمن) /etc/bash.bashrc (حيث يوجد /etc/bash.bashrc). لذلك قراءة مخطوطات قراءة كل الملفات / الخ ، بينما يقرأ غير تسجيل الدخول فقط bash.bashrc.

وتجدر الإشارة أيضًا إلى تعيين /etc/bash.bashrc على عدم القيام بأي شيء عند عدم تشغيله بشكل تفاعلي. لذلك هذين الملفين فقط للنصوص التفاعلية.


3
2017-10-18 18:13