سؤال شيء خاطئ في ملفي


قمت مؤخرا بتثبيت بعض البرمجيات وتحتاج إلى إضافة bin/ الدلائل لبلدي PATH. لا شيء غير طبيعي حتى الآن. لكنني قررت أن أكون ذكيا في ذلك ، وأعاد كتابة جزء من .profile لذلك لم يكن عليّ نسخ / لصق نفس الأسطر القليلة من الرموز مرارًا وتكرارًا. هنا كانت فكرتي:

# Create an array with directories to be added to PATH
declare -a addpath=("$HOME/bin" "$HOME/.cabal/bin" "/opt/vert.x/current/bin")

# Add directories recursively
for dir in "${addpath[@]}"; do
if [ -d "$dir" ]; then
    PATH="$dir:$PATH"
fi
done

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

سؤالي هو؛ ماذا أفعل الخطأ مع هذه الخطوط؟ هل هناك خطأ في بناء الجملة؟ هل هناك طريقة أخرى / أفضل للقيام بذلك؟ ماذا حدث؟


4
2017-08-19 23:55


الأصل




الأجوبة:


في ال الإعداد الافتراضي على أوبونتو 12.04، ال .profile يتم تحميل الملف من قبل /usr/sbin/lightdm-session. هذا هو السيناريو شل ، نفذت من قبل /bin/sh.

على أوبونتو ، /bin/sh هو اندفاع. لقد استخدمت ميزات سحق لا تدعم هذه الشرطة. يتميز كل من Dash و Bash بالميزات الأساسية نفسها ، ولكن يلتفان على هذه الميزات الأساسية حتى يكونا صغيرين وصغيرين ، بينما تضيف باش الكثير من الميزات بتكلفة تتطلب المزيد من الموارد. من الشائع استخدام الشرطة لنسخ البرامج النصية التي لا تحتاج إلى ميزات إضافية وباش للاستخدام التفاعلي (رغم ذلك zsh  لديه الكثير من الميزات أجمل).

اندفاعة ليس لديها صفائف ، ولا declare مدمج ، لذلك هو قصف على هذا الخط. يمكنك وضع قائمة المسارات المضمنة:

for dir in "$HOME/bin" "$HOME/.cabal/bin" "/opt/vert.x/current/bin"; do
  if [ -d "$dir" ]; then
    PATH="$dir:$PATH"
  fi
done

نرى الحفاظ على التكرارات من PATH $ على المصدر إذا كنت تريد التأكد من عدم الانتهاء من إدخالات مكررة.


بدلاً من إضافة أدلة جديدة إلى PATH لكل برنامج تقوم بتثبيته ، قد ترغب في إعداد ارتباطات رمزية في دليل موجود بدلاً من ذلك. إلى عن على ~/.cabal/bin، سترغب في الحصول عليها في المسار الخاص بك لأن التنفيذيين هناك سوف يأتي ويذهب ؛ كنت وضعت في نهاية PATH ، لتجنب الصراعات المحتملة مع البرامج الموجودة على النظام الخاص بك. ~/bin موجود بالفعل في PATH على Ubuntu. بالنسبة للبرامج التي تقوم بتثبيتها يدويًا مثل vert.x ، خبأ أو xstow هو لطيف لإدارة الروابط الرمزية. نرى متابعة البرامج للحصول على مقدمة ل stow.


6
2017-08-20 07:40



آسف على الوقت الذي استغرقته في الرد عليك. شكرا لكم وبالتالي الكثير لإجابتك المفصلة ، تعلمت بالتأكيد شيء هنا! - Sheljohn


أعتقد أنه في حالتك ، فإن أفضل ممارسة لجعل الثنائيات الخاصة بك متوفرة كأوامر هي ربط ما تحتاج إليه / usr / bin. فوضى مع PATH $ ليس من أي وقت مضى شيء جيد للقيام به.

يمكنك استخدام "cp" لإنشاء روابط رمزية ، بشكل متكرر ، على النحو التالي:

cp -rs $HOME/bin/* /usr/bin #This will link all non hidden files
cp -rs $HOME/bin/.[^.]* /usr/bin # This will link all the hidden files

فقط قم بتكييف ذلك مع السيناريو الخاص بك ، باستخدام نفس منطق رمزك الحالي.

تحرير: يمكنك فقط استخدام السطر الأول من التعليمات البرمجية أعلاه إذا قمت بتعيين dotglob إلى صحيح على باش. مثله:

shopt -s dotglob #This will make Bash include filenames beginning with a '.' in the results of filename expansion
cp -rs $HOME/bin/* /usr/bin #Now, this will link ALL files in that directory to the destination

تعديل 2: كما يمكنك أن تقرأ في التعليقات أدناه ، يفضل استخدام / usr / local / bin بدلاً من / usr / bin. اقرأ التعليقات لفهم السبب.


-2
2017-08-20 00:59



هذا هو العكس تماما. يجب أن لا تعبث أبدًا /usr/bin، دع مدير الحزمة يديرها. يمكنك إضافة برامج إلى /usr/local/bin، ولكن كروابط رمزية ، وليس كنسخ. - Gilles
إذا قرأت الكود ، سترى أنني لا أستخدم النسخ. يمكن لـ "cp" كتابة روابط رمزية بدلاً من النسخ. هذا هو أكثر بساطة أن تجعل جميع الروابط رمزية مع 'القانون النموذجي للتحكيم'. ما تقوله عن / usr / bin يمكن أن يكون نصف صحيح هنا على Ubuntu (الذي يستخدم مدير حزمة بالفعل) ولكنه ليس صحيحًا عالميًا ، تذكر ذلك. ملاحظة: NEVER هي كلمة غريبة في عالم Linux. يمكنك ، بالطبع ، القيام بذلك (وسيعمل الجميع في معظم الحالات). والفرق هنا هو أن / usr / bin يستضيف البرامج المدارة بالتوزيع ، ويستضيف / usr / local / bin البرامج الأخرى. لكن هذه اتفاقية ، وليست مشكلة فنية. - Alexandre Teles
أوه ، صحيح ، لقد فاتني -s. لكن الجزء الرئيسي من اعتراضي لا يزال قائما: لا تعبث به /usr/bin. هذا صحيح على أوبونتو وإلى حد كبير أي يونيكس أخرى. بالتأكيد ، ليس قانون الفيزياء. إنها اتفاقية ، مثل القيادة على جانب معين من الطريق. بعض الاتفاقيات مهمة. - Gilles
AlexandreTeles شكرًا جزيلاً على إجابتك. أعلم أن التراجع قد يكون محبطًا جدًا. كنت نية للمساعدة ، وكنت حصلت على "يعاقب" في المقابل. أنا آسف حقا على ذلك (لم أسقط نفسي ، حتى لو كان ينبغي لي). في الواقع ، أنت في الواقع مخطئ ، لكني أشجعك على قراءة المادتين التاليتين لمعرفة السبب: wiki.debian.org/FilesystemHierarchyStandard وثم unix.stackexchange.com/questions/11544/.... حقا لك :) - Sheljohn