سؤال لا يتم إجراء مطالبة مخصصة عندما يتم تشغيل bash تابعة


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

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

الكود كان هكذا:

export PS1="\[$(tput bold)\]\u@\h:\[$(tput sgr 0)\]\e[1;34m\w$ \e[m"

ومع ذلك ، إذا حاولت تشغيل إصدار bash آخر في الإصدار الحالي ، فستصبح المطالبة غير منسّقة:

غير أن وضعها الطبيعي؟ أليست النقطة بأكملها هي تصدير متغير لجعله متاحًا من جميع العمليات الفرعية التي تم تكوينها من تلك القوقعة؟ لماذا لا ينطبق هذا على هذا الوضع؟


4
2017-08-21 09:13


الأصل


هل لي أن أسأل ، أين وضعت export مكالمة ؟ عند نهاية ال ~/.profile ؟ - Sergiy Kolodyazhnyy
Serg كان في ~/.bash_profile ، انتقلت إلى ذلك ~/.bashrc وحذف الملف السابق حيث لم يكن هناك سوى التخصيص الفوري و ls  grep  dir الأسماء المستعارة للإخراج الملون في الملف. بناء على إجابتك حصلت على ذلك إذا لم يكن هناك ~/.bash_profile ملف على الإطلاق ، رمز في ~/.bashrc يجب أن يكون مصدرها ، لكل من قذائف الدخول وغير تسجيل الدخول ؛ لذلك فعلت كما اقترحت و voila! شكرا جزيلا! - etka


الأجوبة:


TL، DR: فقط ضع الدعوة إلى PS1 إلى ~/.bashrc أو استدعاء subshells مع -l علم

يقترح جواب زانا بشكل مناسب أن يحدد PS1 في ~/.bashrc لتكون مصدرا من قبل قذائف التفاعلية.

ومع ذلك ، يمكنك استخدامها -l علم لمعالجة subshell كـ shell تسجيل الدخول:

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ echo "PS1='TEST$ '" > ~/.profile

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ bash
xieerqi@eagle:~$ exit

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ bash -l
TEST$ 

"لماذا"

غير أن وضعها الطبيعي؟ أليست النقطة بأكملها هي تصدير متغير لجعله متاحًا من جميع العمليات الفرعية التي تم تكوينها من تلك القوقعة؟ لماذا لا ينطبق هذا على stiuation؟

نعم ، هذا هو السلوك المتوقع. عندما تقوم بتصدير شيء ما ، يجب أن تنتشر المتغيرات لأسفل إلى subshells.

xieerqi@eagle:~$ export VAR=303
xieerqi@eagle:~$ bash
xieerqi@eagle:~$ echo $VAR
303
xieerqi@eagle:~$ ksh
$ echo $VAR
303

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

أما بالنسبة لل ~/.profile يتم تشجيع بالفعل على تعيين وتصدير متغيرات البيئة من هناك وهو ممارسة متكررة.

وللتصدي لشرح زانا لسبب تلوين القشرة الأولى ، أعتقد أن هذا هو السبب:

عندما يتم استدعاء باش كقذيفة تسجيل دخول تفاعلي. . . يقرأ أولاً وينفذ الأوامر من الملف / etc / profile ، إذا كان هذا الملف موجودًا. بعد قراءة هذا الملف ، فإنه يبحث عن ~ / .bash_profile و ~ / .bash_login و ~ / .profile ، بهذا الترتيب، ويقرأ وينفذ الأوامر من أول واحد  موجود وقابل للقراءة. (من صفحة باش مان ، التأكيد مضاف)

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


5
2017-08-21 10:26



Zanna تحمل خيولك هناك. إجابتك صحيحة - يقوم الأشخاص بتعيين المطالبة المخصصة في ~/.bashrc كل الوقت. هذه هي الطريقة الصحيحة للقيام بذلك. هناك المزيد لذلك. سأقوم بتحديث إجابتي في مرحلة ما. أما بالنسبة للحفظ أو الحذف ، فالأمر بالطبع متروك لك ، لكني لا أشجعك على القيام بذلك - Sergiy Kolodyazhnyy
بالتأكيد ، هذه هي الطريقة التي أضع بها المنجم ... لقد قرأت تفسيرك ، وهذا هو بالضبط ما فهمته أيضًا ، ولكنني ما زلت لا أفهم السبب .bashrc لا يتخطى env في الغلاف الأول (فعل عندما اختبرت ذلك) - Zanna
@ زنا همم ، نقطة جيدة. ربما هناك شيء أكثر من ذلك الحين - Sergiy Kolodyazhnyy


.bash_profile مصدره قذائف الدخول فقط. لقد تم الحصول عليه عند تسجيل الدخول إلى جلسة X ، وبيئة موروثة كما يشرح @ سراج بالتفصيل. بطريقة ما ، قمت بإدارة تكوين لا يتم تجاوز هذه البيئة به .bashrc، وربما وضع الجهاز الخاص بك لفتح قذيفة تسجيل الدخول بشكل افتراضي. يمكنني إعادة إنتاج السلوك الذي واجهته من خلال تهيئة جهاز طرفي كالتالي:

هذا يؤدي إلى فتح shell كـ shell تسجيل الدخول ، ولكن سيكون أي طفل يسمى shell غير تسجيل الدخول و المصدر .bashrc، ليس .bash_profile إلا ، كما يقترحSerg ، و -l يستخدم العلم.

TL، DR
إذا كنت تريد أن يتم الحصول على الموجه المخصص من خلال الأصداف التفاعلية ، ضع الشفرة في .bashrc


6
2017-08-21 09:54



آه ، نعم ، صيد جيد! يلعب المحاكي دورًا أيضًا - Sergiy Kolodyazhnyy