سؤال الاختيار بين .bashrc و .profile و .bash_profile وغير ذلك [مكرر]


هذا السؤال لديه بالفعل إجابة هنا:

هذا أمر محرج ، ولكن بعد سنوات عديدة من استخدام أنظمة POSIX بدوام كامل ، ما زال لدي صعوبة في معرفة ما إذا كان تخصيص shell يجب أن يدخل .bashrc، .profile، أو في مكان آخر. ناهيك عن بعض ملفات التكوين OS- محددة مثل .pam_environment.

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


174
2017-07-29 03:14


الأصل


يجب عدم وضع علامة على هذا السؤال على أنه تكرار ، والسبب هو أن .profile غير متاح في السؤال المضاف. - Premraj
الجواب: serverfault.com/q/261802/270464 - Premraj


الأجوبة:


TL، DR:

  • ~/.bash_profile يجب أن تكون بسيطة للغاية وتحميل فقط .profile و .bashrc (بهذا الترتيب)

  • ~/.profile لديه الاشياء ليست على وجه التحديد المتعلقة باش ، مثل متغيرات البيئة (PATH والأصدقاء)

  • ~/.bashrc لديه أي شيء تريده في سطر الأوامر التفاعلي. موجه الأمر، EDITOR المتغير ، وأسماء bash المستعارة للاستخدام

بعض الملاحظات الأخرى:

  • أي شيء يجب أن يكون متاحًا للتطبيقات الرسومية أو إلى sh (أو bash invoked as sh) يجب أن يكون في ~/.profile

  • ~/.bashrc يجب عدم إخراج أي شيء

  • يجب أن يدخل أي شيء يجب أن يكون متاحًا فقط لقذائف تسجيل الدخول ~/.profile

  • ضمان ~/.bash_login غير موجود.


193
2017-07-29 04:27



+1 ، وهذا يسمح ~/.profile لضبط البيئة بشكل صحيح لخدمات مثل GDM / LightDM / LXDM والتي تعمل بشكل صريح / bin / sh. - grawity
لي .bashrc يخرج الكثير من الأشياء ، يمكنك التعليق على ذلك؟ على وجه الخصوص ، أين يجب أن أضع إخراج التحية؟ - Calimo
Calimo: جعلها الاشياء الانتاج فقط في الوضع التفاعلي. يمكنك اختبار استخدامه [[ $- == *i* ]]، وهذا هو ، أبحث عن "أنا" في الخاص $- متغير. بالطبع ، لا يهم سوى في المقام الأول على الأنظمة حيث يتم جمع باش للقراءة .bashrc في الوضع غير التبادلي. (وهذا هو ، دبيان ولكن ليس القوس.) لكنه سبب متكرر لرسائل الخطأ الغامضة عند محاولة الاتصال باستخدام sftp أو scp أو أدوات مشابهة. - grawity
الآن يجب أن أعرف لماذا يجب أن .bash_login غير موجود؟ ماذا تعمل، أو ماذا تفعل؟ - tedder42
@ tedder42: يفعل نفس الشيء .bash_profile و .profile. لكن باش فقط يقرأ الأول من أصل ثلاثة. يعني ، إذا كان لديك .bash_login، ثم كلاهما .profile و .bash_profile سيتم تجاهلها في ظروف غامضة. - grawity


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

المتطلبات:

  • ~/.profile يجب أن يكون متوافقًا مع أي / bin / sh - يتضمن هذا bash و dash و ksh وأي شيء آخر قد يختار توزيعة استخدامه.

  • يجب وضع متغيرات البيئة في ملف يتم قراءته بواسطة كل من تسجيلات الدخول لوحدة التحكم (أي shell "تسجيل الدخول") وعمليات تسجيل الدخول الرسومية (أي مديري العرض مثل GDM أو LightDM أو LXDM).

  • هناك نقطة صغيرة جدا في وجود على حد سواء  ~/.profile و ~/.bash_profile. إذا كانت هذه الأخيرة مفقودة ، فسرعان ما سيستخدم باش السابق ، وأي خطوط خاصة بها يمكن أن تخضع للحراسة بشيك $BASH أو $BASH_VERSION.

  • الفصل بين *profile و *rc هو أن يتم استخدام السابق لقذائف "تسجيل الدخول" ، وهذا الأخير في كل مرة تفتح نافذة طرفية. ومع ذلك ، لا يمثل bash في وضع "تسجيل الدخول" مصدرًا ~/.bashrc، وبالتالي ~/.profile يحتاج إلى القيام بذلك يدويا.

ال أبسط التكوين سيكون:

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

    تصدير TZ = "أوروبا / باريس"
    تصدير EDITOR = "vim"
    إذا كان ["$ BASH"]؛ ثم
        . ~ / .bashrc
    فاي
    مدة التشغيل
    
  • عند ~/.bashrc ينفذ أي إعداد خاص بالعلبة ، محميًا بشيك له الوضع التفاعلي لتجنب كسر أشياء مثل sftp على دبيان (حيث يتم ترجمة bash مع خيار التحميل ~/.bashrcحتى بالنسبة للأصداف غير التفاعلية):

    [[$ - == * i *]] || العودة 0
    
    PS1 = '\ h \ w \ $'
    
    start () {sudo service "$ 1" start؛ }
    

ومع ذلك ، هناك أيضًا مشكلة تتعلق ببعض الأوامر غير التفاعلية (على سبيل المثال ، ssh <host> ls) تخطى ~/.profile، لكن متغيرات البيئة ستكون مفيدة للغاية بالنسبة لهم.

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

    إذا ! ["PREFIX $"] ؛ ثم # أو $ EDITOR ، أو $ TZ ، أو ...
        . ~ / .environ # عموما أي متغير أن. البيئة نفسها من شأنه أن يحدد
    فاي
    
  • لسوء الحظ ، بالنسبة إلى التوزيعات الأخرى (مثل القوس) ، لم أجد حلًا جيدًا. أحد الاحتمالات هو استخدام وحدة PAM_env PAM (تمكين افتراضيا) ، عن طريق وضع ما يلي ~/.pam_environment:

    BASH_ENV =. /. البيئى # ليس خطأ مطبعي ؛ يجب أن يكون المسار ، ولكن ~ لن ينجح
    

    ثم ، بالطبع ، التحديث ~/.environ إلى unset BASH_ENV.


استنتاج؟ القذائف هي ألم. متغيرات البيئة هي ألم. خيارات وقت التحويل الخاصة بالتوزيع هي هائل ألم في المؤخرة.


46
2017-07-29 15:28



إجراء 1+ للفقرة الأخيرة ، ولكنني أفضل اختيار المصادر .profile و .bashrc من عند .bash_profile والحفاظ عليها .profile نظيفة. - nyuszika7h
@ nyuszika7h: .profile  نظيف، شكر. - grawity
لاحظ أن التعليق في كل مرة تقوم فيها بفتح نافذة هو العكس بالنسبة لـ OSX - Mark
"هناك نقطة صغيرة جدا في وجود الاثنين معا ~/.profile و ~/.bash_profile": أنا لا أوافق. انظر دان الجواب عن السبب. - rubenvb
rubenvb هل يمكنك ذكر الجزء ذو الصلة؟ أعتقد أنه من الجيد أن يكون فقط .profile وحراسة bashأجزاء محددة مع الشرطية. - Kelvin


الق نظرة على هذا بلوق وظيفة ممتازة من قبل 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      |           |      |
+----------------+-----------+-----------+------+

29
2017-07-29 03:39



هذا لطيف. من المهم أن نلاحظ ذلك عادة /etc/profile المكالمات /etc/bash.bashrcو ~/.profile المكالمات ~.bashrc. بشكل فعال /etc/bash.bashrc و ~/.bashrc يتم تنفيذها لتسجيلات تفاعلية كذلك. - wisbucky
لاحظ أن بعض التوزيعات تبدو أنها تلغي هذا المخطط (مع وجود عواقب غريبة) - انظر على سبيل المثال. تقرير الخطأ الخاص بي ليتم استخدامه هنا: bugzilla.opensuse.org/show_bug.cgi؟id=1078124 - Christian Herenz


أقدم لك إرشادات "شاملة":

  • يصنع .bash_profile و .profile حمل .bashrc إذا كان موجودًا ، على سبيل المثال ، [ -r $HOME/.bashrc ] && source $HOME/.bashrc
  • ضع كل شيء في .bashrc.
  • وقف القلق.
  • كل أربع سنوات أو نحو ذلك ، أقضي عشر دقائق في البحث في هذا السؤال بالذات قبل الاستسلام والعودة إلى "لا تقلق".

تحرير: أضيفت يقتبس الخوف إلى "شامل" فقط في حالة أي شخص هو إغراء الاعتقاد بها. ؛)


19
2017-07-31 02:45



بعد كلا .bash_profile و .profile هو زائدة بعض الشيء. ما عليك سوى هذا الأخير. أنت بحاجة إلى إجراء / bin / sh-proof ، على الرغم من: if [ "$BASH" ] && [ -r ~/.bashrc ]; then . ~/.bashrc; fi، حيث أن هناك برامج (وهي gdm / lightdm) التي تقوم يدويًا بتصدير الملف من برنامج نصي / bin / sh. هذا يعني أيضا أن البيئة ظلت في .bashrc سيكون غير فعال. اضطر إلى -1 ، لأن إرشادات "شاملة" لن تعمل على العديد من الأنظمة ، حيث اكتشفت الطريق الصعب عدة مرات. - grawity
لا توجد مشكلة ، سأدفع بسرور 1 مقابل إجابة ليست مجرد لسان خدعة "شاملة" ، وقد حصلت بالتأكيد على هذا اللقب. - Mechanical Fish


استسلمتُ في محاولة تحديد هذا الأمر وجعل نصًا واحدًا (~/.shell-setup) التي مصدرها من جميع الآخرين.

هذا النهج يتطلب ~/.shell-setup الحصول على ميزتين:

  1. قم بتشغيلها مرة واحدة فقط ، حتى عند مصادرها بشكل متكرر (استخدم وتشمل الحراس)
  2. لا تولد أي إخراج غير مرغوب فيه (تكتشف عندما يكون المخرج على ما يرام)

# 1 هو مستوى جيد ، على الرغم من أنه ربما لا يستخدم كثيرًا في نصوص shell.

# 2 هو اصعب. إليك ما استخدمه في bash:

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

لسوء الحظ ، لا أتذكر كيف توصلت إلى هذا ، أو لماذا الكشف عن قذيفة التفاعلية لم تكن كافية.


0
2017-07-29 03:50





ضع كل شيء فيه .bashrc ومن ثم المصدر .bashrc من عند .profile

من صفحة رجل باش (على OS X 10.9):

عندما يتم بدء تشغيل shell التفاعلي الذي لا يكون shell تسجيل الدخول ، يقرأ bash وينفذ الأوامر من ~ / .bashrc ، إذا كان هذا الملف موجودًا. قد يتم منع هذا باستخدام الخيار --norc. سيقوم خيار ملف -rcfile بإجبار bash لقراءة وتنفيذ الأوامر من الملف بدلاً من ~ / .bashrc

النص أعلاه هو لماذا يتم وضع كل شيء في .bashrc. ومع ذلك ، هناك سلوك مختلف قليلاً عند التعامل مع shell تسجيل الدخول. مرة أخرى ، نقلا عن الصفحة الرجل:

عندما يتم استدعاء bash كصورة تسجيل دخول تفاعلية ، أو كقذيفة غير تفاعلية مع الخيار --login ، فإنه يقرأ وينفذ الأوامر أولاً من الملف / etc / profile ، إذا كان هذا الملف موجودًا. بعد قراءة هذا الملف ، فإنه يبحث عن ~ / .bash_profile و ~ / .bash_login و ~ / .profile ، بهذا الترتيب ، ويقرأ وينفذ الأوامر من أولها موجود وقابل للقراءة. يمكن استخدام الخيار --noprofile عند بدء shell لمنع هذا السلوك.

.profile للقراءة لقذائف تسجيل الدخول ، ولكن .bashrc ليس. تكرار كل تلك الأشياء في .bashrc سيئة لذا نحتاج إلى مصدرها .profile لكي يظل السلوك ثابتًا.

ومع ذلك ، لا تريد المصدر .bashrc من عند .profile دون قيد أو شرط. يرجى الاطلاع على التعليقات والإجابات الأخرى للحصول على تفاصيل إضافية.


-1



-1، لا مصدر .bashrc من عند .profile. انظر @ DanRabinowitz الجواب. - nyuszika7h
على الأقل ليس بدون شروط. - nyuszika7h
[ -n "$BASH" -a -f ~/.bashrc ] && . ~/.bashrc سيكون a oniner الحلو ل .profile. - John WH Smith
@ nyuszika7h ، لماذا لا؟ يبدو الجميع لنقترح القيام بذلك. - Pacerier