سؤال Zsh لا تصل إلى ~ /


لقد قمت للتو بتثبيت zsh على نظام Ubuntu الخاص بي. يبدو أن zsh لا ينفذ ~ / .profile على init. لفهم أفضل ، ينبغي أن يكون هذا السلوك التلقائي. ماذا ينقصني؟


107
2017-09-12 07:20


الأصل




الأجوبة:


.profile ضد. .zprofile

يدير زش ~/.zprofile، ليس ~/.profile، عندما يتم استدعاؤه كقاعدة تسجيل دخول. السبب هو أن لدى zsh حالات عدم توافق كافية مع الأصداف القياسية لكسر البرامج النصية.

يعمل Zsh ~/.profile إذا تم استدعاؤها باسم sh أو ksh. ولكن إذا كان هدفك هو الحصول على مطالبة zsh عند تسجيل الدخول ، فهذا لن يساعدك.

تستطيع فعل /bin/sh قذيفة تسجيل الدخول الخاصة بك وتشمل export SHELL=/bin/zsh في حياتك ~/.profile. ثم عند فتح محطة ، ستقوم المحطة بإطلاق zsh (باستثناء بعض المحاكيات الطرفية لا تطيع $SHELL ضبط). لكن لا يزال لديك sh عند تسجيل الدخول عبر ssh. يمكن علاج هذا من خلال تضمين exec zsh في نهاية ~/.profile (هذا يستبدل shell قيد التشغيل بواسطة zsh) ، ولكنك تحتاج إلى توخي الحذر فقط للقيام بذلك من أجل تسجيلات الدخول التفاعلية وليس عندما ~/.profile يتم تضمينها من البرامج النصية الأخرى مثل بدء جلسة X (الاختبار الجيد هو اسم العملية الرئيسية التي تم الحصول عليها بواسطة ps -o comm= $PPID: إذا كان sshd أو su، ثم آمن exec).

أسهل حل لكلا العمل مع zsh وتشغيل ~/.profile هو خلق ~/.zprofile يدخل وضع مضاهاة sh أثناء تشغيله ~/.profile:

emulate sh
. ~/.profile
emulate zsh

إذا كان لديك zsh حديثًا بما فيه الكفاية (على Ubuntu ، فهذا يعني منذ الوضوح ، على ما أظن) ، يمكنك تبسيط هذا الأمر emulate sh -c '. ~/.profile'.

.zprofile ضد. .zshrc

الملف ~/.profile يتم تحميلها من قبل تسجيل الدخول اصداف. تعتبر shell login هي أول عملية يتم تشغيلها عند تسجيل الدخول في وضع النص ، على سبيل المثال في وحدة تحكم بالنص أو عبر ssh. افتراضيًا ، في معظم أجهزة Linux ، يكون shell تسجيل الدخول هو bash ، ولكن يمكنك تغييره باستخدام chsh أو من خلال بعض الأدوات الأخرى مثل "إعدادات المستخدم" في أوبونتو. عندما تكون قوقعة تسجيل الدخول ، يقرأ "باش" ~/.bash_profile إذا كان موجودًا و ~/.profile، بينما zsh يقرأ فقط ~/.zprofile (لأن بناء الجملة الخاص بها غير متوافق تمامًا مع sh التقليدي). تحت معظم التكوينات ، ~/.profile يتم تحميله أيضًا بواسطة البرامج النصية لبدء تشغيل جلسة العمل X عند تسجيل الدخول في مدير عرض رسومي.

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

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


155
2017-09-12 10:37



جواب رائع! لقد قمت بإنشاء ~ / .zprofile ووضع الخط كما اقترح ، ولكن لا يبدو أن تفعل أي شيء. ربما ينبغي لي وضعه في .zshrc؟ - shmichael
shmichael: في ضوء رد فعلك ، ربما لم أفسر سؤالك بالطريقة التي قصدتها. هل يساعد القسم الثاني الذي أضفته إلى إجابتي؟ - Gilles
نعم ، وضرب على الفور. لذلك إذا فهمت بشكل صحيح ، فأنا أريدها على سبيل المثال. إعلانات PATH على .zprofile والأسماء المستعارة على .zshrc. - shmichael
@ user1419674 نشكرك على التصحيح ، ولكن لا تضيف سجل التغيير إلى المشاركات. يحتوي الموقع على تاريخ مراجعة مضمّن. - Gilles


إجابة قصيرة على الأشخاص غير الصبور:

  1. ~/.profile لم يتم تحميلها من قبل zsh عند تسجيل الدخول.
  2. zsh الأحمال ~/.zprofile عند تسجيل الدخول.
  3. zsh الأحمال ~/.zshrc عند بدء جلسة محطة جديدة.

بحاجة الى مزيد من المعلومات؟ انظر إلى إجابة جيل الرائعة!


42
2018-03-21 13:38



+2 للحصول على إجابة سريعة قابلة للمسح - dreftymac


بالإضافة إلى إجابة جيل ، مع إصدار حديث إلى حد معقول من zsh يمكنك القيام بذلك:

[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'

... التي ستصدر الملف .profile مع وضع shsh في سارية المفعول. وهي نشطة فقط أثناء المصدر. لذلك ليس عليك حفظ حالة الخيار الحالية لإعادة تشغيلها مرة أخرى بعد تحديد المصادر.


16
2018-03-09 22:20



لدي هذا في ~ / .zprofile ، ولكن لسبب ما لا تتوفر عبارات في ~ /. ملف التعريف في shell. أوبونتو 15.04. zsh 5.0.7 - friederbluemle
من الصعب تشخيص دون رمز. - Frank Terbeck
لقد حاولت مرة أخرى ، ويبدو أنها تعمل الآن. لست متأكدا إذا كان قد تم إصلاحه في مرحلة ما أو ما حدث. النسخة زش هو 5.1.1 الآن. - friederbluemle


لدي .zprofile متوافق مع .profile (يحتوي على تغييرات PATH فقط) ، وبالتالي يحتاج فقط:

ln -s .profile .zprofile

4
2018-04-14 15:30





ال zsh وثائق لدي في متناول اليد إلا يذكر /etc/profile و ~/.profile لتسجيل الدخول في ش/KSH وضع التوافق.

% zsh --version
zsh 4.3.10 …
% cat ~/.profile
echo 'Running ~/.profile...'

الوضع الأصلي تسجيل الدخول shell (argv [0] يبدأ بـ -) لا تستخدم ~/.profile (سوف تستخدم ~/.zprofile على أية حال):

% zsh -c 'exec -a -zsh zsh' </dev/null

(لا يوجد خرج)

ش/KSH تستخدم قذائف تسجيل وضع التوافق .profile:

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...

0
2017-09-12 09:20