Fish-shell: PATH / MANPATH / CDPATH ذات غلاف خاص غريب ؛ نحن بحاجة إلى حل أكثر عمومية مثل متغيرات zsh "tied"

تم إنشاؤها على ١١ ديسمبر ٢٠١٢  ·  52تعليقات  ·  مصدر: fish-shell/fish-shell

في expand.h :

/** Character for separating two array elements. We use 30, i.e. the ascii record separator since that seems logical. */
#define ARRAY_SEP 0x1e

/** String containing the character for separating two array elements */
#define ARRAY_SEP_STR L"\x1e"

وينتج عنه:

xiaq<strong i="10">@blackie</strong> ~> set a (printf 'a\x1eb')
xiaq<strong i="11">@blackie</strong> ~> count $a
2
xiaq<strong i="12">@blackie</strong> ~> set a (printf 'a\x1fb')
xiaq<strong i="13">@blackie</strong> ~> count $a
1

من الواضح أن char \ x1e يتم التعامل معه بشكل خاص كمحدد للعنصر.

enhancement

ال 52 كومينتر

هل القلق من عدم وجود طريقة لتمثيل \ x1e؟ أم أنك تفكر في التحسينات المعمارية؟

أعتقد أن فاصل الصفيف يستخدم بشكل أساسي في المصفوفات المستمرة في الأماكن التي تأخذ سلاسل فقط ، مثل المتغيرات العامة أو متغيرات البيئة.

在 2012-12-12 上午 2:09 , إخطارات "سمكة سخيفة" github.com 写道

هل القلق من عدم وجود طريقة لتمثيل \ x1e؟ أم أنك تفكر
حول التحسينات المعمارية؟

أود أن أقول إن لدي كلتا المشاعر في الاعتبار. بالنسبة إلى السابق ، فكر فقط في ملف
اسم الملف مع تضمين \ x1e. يقول POSIX أي شيء ولكن يُسمح بـ \ 0 في
أسماء الملفات ، لذا فمن الممكن تمامًا. قد يكون استخدام \ 0 كمحددات للصفيف
خيارًا أفضل قليلاً ، لكن هذا يؤدي إلى القلق الثاني - إنه
هشة وخاطئة بشكل واضح.

أعتقد أن فاصل الصفيف يستخدم بشكل أساسي في المصفوفات المستمرة في الأماكن
التي تأخذ سلاسل فقط ، مثل المتغيرات العامة أو متغيرات البيئة.

إذا كان استمرار يعني "متسلسلة" ، لا. يتم تخزين المصفوفات دائمًا في ملفات
\ شكل محدد x1e. يتم ربط صفيفات البيئة المُصدَّرة بـ ":". هم
تستخدم في المتغيرات العالمية - التي يجب تنفيذها IMHO
مع الهروب المناسب بدلاً من ذلك.

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub.

ماذا عن استخدام حرف منطقة الاستخدام الخاص كفاصل؟ تستخدم الأسماك بالفعل بعضًا من هؤلاء في بعض الحالات.

تضمين التغريدة إنه ممكن تمامًا في أسماء الملفات (مع الأخذ في الاعتبار أنظمة الملفات التي تستخدم non-utf8 والتشفير الأصلي) والسلاسل الأخرى.

أود أن أقول أنه من بين أمور أخرى ، يعد "\0" خيارًا أفضل _ قليلاً_ من بين آخرين ، نظرًا لأن هذا هو الحرف الوحيد الذي يحظره نظام UNIX في أسماء الملفات ، لكنه لا يزال يتمتع برائحة كريهة بالنسبة لي. أيضًا ، نحن نقوم بالفعل بالكثير من تقسيم المصفوفات وتجميعها ، وأتوقع أن يؤدي تطبيق المصفوفات الحقيقية إلى بنية أفضل وتعليمات برمجية أقل.

يتعامل Fish بالفعل مع أحرف الاستخدام الخاص والبايتات غير الصالحة عندما يقوم بترميز السلاسل الخارجية إلى wchars. يتم ترميز هذه القيم الخاصة بالبايت بايت في مجموعة محددة من أحرف الاستخدام الخاص التي تقوم الأسماك أيضًا بفك تشفيرها مرة أخرى عند الإخراج ، لذلك من حيث المبدأ ، يمكن أن ينجح استخدام حرف خاص آخر. ومع ذلك أوافق على استخدام المصفوفات الحقيقية أفضل بكثير. هناك تعقيد واحد في هذا الاتصال بين fish و fishd يحدث عبر مقبس باستخدام سلاسل utf8 ، وهناك تستخدم الأسماك (أعتقد) تسلسل الهروب "\ x1e" (بدلاً من 0x1e بايت) لفصل عناصر المصفوفة. ولكن يمكن حل ذلك على الأرجح باستخدام تسلسل هروب خاص غير مستخدم على سبيل المثال.

أشارك شياق في مخاوفها ، لكن (بالنسبة للعملية) أجد التقسيم الضمني \ n أكثر هجومًا:

a<strong i="6">@raspeball</strong> ~> count (printf 'a\x1eb')
1
a<strong i="7">@raspeball</strong> ~> count (printf 'a\nb')
2

يجب أن يكون تفسير المصفوفة (المحدَّد بالسطر الجديد) لإخراج العملية الفرعية واضحًا واختياريًا!

ولكن ربما لا علاقة لذلك بالتخزين الأساسي للمصفوفات ...

xiaq : ما مشكلة استخدام \0 ؟ يبدو أن xargs يستخدمه كخيار "موثوق".

لا يمكنك استخدام \0 في متغيرات البيئة ، لذلك سيكون من الصعب تصدير المصفوفات إلى أصداف فرعية.

أنا أقوم بالترحيل من zsh حيث أستخدم هذا التسلسل لتحديد var $ LESS env بأسلوب عاقل من خلال الاستفادة من ميزة المتغيرات "المرتبطة":

typeset -xT LESS less ' '
less=(
    --HILITE-UNREAD
    --LONG-PROMPT
)

لقد حذفت القائمة الكاملة لخيارات الإيجاز. في zsh ، ينتج عن هذا $ LESS env var كونه قائمة مفصولة بمسافات من الخيارات في المصفوفة $ less. ينتج عن المكافئ في الأسماك أن العناصر يتم فصلها بواسطة حرف فاصل السجل (\ x1e). على الرغم من الوثائق التي تشير إلى أن عناصر المصفوفة سيتم فصلها بمسافات (نموذج المصفوفات الخاصة مثل PATH). يجب أن أقوم صراحةً بمهمة تقحم القيم في سلسلة واحدة للحصول على النتيجة المتوقعة:

set -x LESS --HILITE-UNREAD \
    --LONG-PROMPT
set LESS "$LESS"

في الوقت الحالي ، لا أهتم حقًا إذا تم استخدام \ x1e داخليًا لتسلسل المصفوفات بدلاً من \ x00. يهمني أن المصفوفات التي تم تصديرها يتم فصل عناصرها بـ \ x1e. هذا مجرد كسر ، خطأ ، fubar. اختر صفتك. كما أنه غير متوافق مع الحل البديل المذكور أعلاه والسلوك الموثق. يجب وضع علامة على هذه المشكلة على أنها خلل IMHO.

ملاحظة ، لم يتم ذكر استخدام حرف فاصل السجل (\ x1e) في أي مكان في الوثائق. وهي مشكلة أخرى.

@ krader1961 شكرا لتقاسم هذا. لا يوجد اصطلاح قياسي في نظام Unix لمتغيرات البيئة الشبيهة بالقوائم - بعضها محدد بنقطتين ، والبعض الآخر محدد بمسافة. تستخدم الأسماك \ x1e حتى تتمكن من تمييز المصفوفات الخاصة بها.

هل يمكنك توجيهنا إلى الوثائق الخاطئة؟

كيف تعتقد أن المصفوفات سيتم تصديرها - النقطتين ، والمسافات ، والخطوط الجديدة ، وشيء آخر؟ هل يجب على الأسماك ترميز متغيرات البيئة على هذه الشخصية أيضًا؟

يبدو أن أقل تتوقع حججًا محددة بمسافات. ربما يكون أبسط حل بديل هو set -x LESS '--HILITE-UNREAD --LONG-PROMPT' ، إلخ.

لا يوجد معيار لقائمة مثل متغيرات البيئة لأنها حسب التعريف عبارة عن تسلسل عشوائي من البايت يتكون من مفتاح وقيمة مفصولة بعلامة تساوي وتنتهي ببايت فارغ. ليس عليهم حتى أن يكونوا أحرفًا قابلة للطباعة. الاصطلاح الوحيد المقبول على نطاق واسع لمستوى أعلى من التجريد هو الذي أنشأته دالة execlp () لـ PATH env var.

التوثيق خاطئ لأنه لا يذكر استخدام \ x1E ، \ 036 ، 30 ، أو "فاصل السجل" لفصل عناصر المصفوفة عند تصدير var مع أكثر من عنصر واحد. الوثائق تنص على ذلك

..., and array variables will be concatenated using the space character.

هذا من قسم "توسيع المتغير" في http://fishshell.com/docs/current/index.html. من المعقول أن نستنتج أن هذه العبارة تنطبق أيضًا على المتغيرات المُصدرة التي لا تحتوي على غلاف خاص كما هو موثق في قسمي "المصفوفات" و "المتغيرات الخاصة" في نفس المستند.

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

في حالة عدم وجود آلية لتكوين الحرف ليتم استخدامه على أساس var by var (الأمر ala the zsh "typeet -T") ، يجب استخدام مسافة عند ربط عناصر المصفوفة (مرة أخرى ، باستثناء المتغيرات الخاصة التي يتم فصلها بنقطتين) ). من الواضح أن هذا لا ينطبق على مخازن البيانات الخاصة مثل تخزين المتغيرات العالمية.

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

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

يمكن للمستخدمين ترميز السلاسل باستخدام مثال set SOMEPATH (string split : $SOMEPATH) .

الجانب السلبي للمتغيرات المصدرة المتسلسلة للمسافات هو أنها تتغير عندما يتم تشغيل الأسماك بشكل متكرر. يعمل هذا اليوم:

> set -x list 1 2 3
> count $list
3
> fish -c 'count $list'
3

ولكن إذا قمنا بالتصدير بمسافات ، فسيظهر هذا 1 للمكالمة العودية. كما تقول نحن لا نعتمد على هذا ، لكنه لطيف من وجهة نظر الاتساق.

شكرا لاستجابة مدروسة الخاص بك.

سآخذ ثانية على ذلك! من الجيد دائمًا أن يكون لديك منظور جديد للأشياء.

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

ما يتبادر إلى الذهن على الفور هو القائمة البيضاء ، والتي تظهر في قضايا مثل # 2090.

هذا يعني أنه بالنسبة إلى $ PATH و $ CDPATH و $ MANPATH ، ستظهر كقوائم / مصفوفات للأسماك ، ولكن عند تصديرها ، سيتم ضمها بـ ":" مرة أخرى. ثم سمكة داخل سمكة ستقسمهم مرة أخرى. هذا يعمل على النقطتين ، وليس \ x1e. من خلال فهمي للكود ، يبدو أنه يفعل ذلك في كل نقطتين ، دون أي فرصة للهروب ، لذلك قد ينكسر على إدخالات $ PATH بداخلها نقطتان - وهو ما يسمح به نظام UNIX داخل مسارات الملفات ، على الرغم من أنه يبدو مكسورًا لـ $ PATH على الأقل . يستخدم هذا المخطط أيضًا على سبيل المثال PYTHONPATH و GOPATH.

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

سيكون الحل المفضل لدي هو وظيفة مثل splitenv var1 var2 var3 :

function splitenv --no-scope-shadowing
    set -e IFS # string split doesn't have superpowers, so unset IFS lest we split on both : and \n
    for arg in $argv
        set -q $arg; and set $arg (string split ":" $$arg)
    end
end

(إذا كان لدى string split قوى خارقة ، فسيكون هذا أبسط قليلاً)

سيتم بعد ذلك ضم جميع القوائم مع النقطتين عند تصديرها ، بحيث يمكن للمستخدم أن ينضم إليها صراحةً بـ splitenv (على الرغم من أنني لست جاهزًا للعمل على وظيفة المساعد ، أعتقد أن جعل هذا التافه أمرًا جيدًا شيء نفعله). للتوافق مع الإصدارات السابقة ، سيتم تنفيذ splitenv PATH CDPATH MANPATH عند بدء التشغيل. إذا كان المستخدم يرغب في تصديره بشكل مختلف ، فإن string join متاح.

كل هذا يعني أننا لم نعد بحاجة إلى \ x1e ، فلدينا مخطط لديه على الأقل فرصة قتالية لفهم البرامج الأخرى ، ولكن (IMHO) fish-inside-fish (الغريبة إلى حد ما) أصبح الآن fish -c 'splitenv list; count $list' .

تكمن المشكلة بالطبع ، كما ذكرنا ، في أن مخطط القائمة المفصولة بالنقطتين المعتاد ليس لديه طريقة للهروب من النقطتين ، وإذا أردنا إضافة واحدة ، فإن string split لا يحتوي على "- unescaped" خيار الانقسام فقط على الفواصل التي لم يتم تجاوزها.

هل لدي أي معنى؟

faho أعتقد أن هذه الفكرة لها ميزة. كان أسوأ جزء من المخطط القديم هو الانقسام الضمني على النقطتين ، مما قد يفسد المتغيرات التي لا ينبغي تقسيمها. في فكرتك ، يكون هذا (تقريبًا) صريحًا دائمًا لذا أعتقد أنه آمن تمامًا.

فيما يتعلق بالهروب ، فإن عدم الهروب من القولون في PATH متعمد وفقًا للرابط الذي وجدته. أشك في أن PYTHONPATH و CLASSPATH وما إلى ذلك أكثر اتساقًا في هذا الصدد. نظرًا لأنه لا يمكنك استخدام نقطتين في هذه المسارات ، يمكننا اختيار ما إذا كنا سنهرب منها أم لا ؛ ولكن إذا هربنا من القولون ، نحتاج إلى الهروب من الخطوط المائلة العكسية ، وأراهن أنه يمكنك الحصول على شرطة مائلة للخلف في PATH. قد نحتاج إلى القائمة البيضاء "عدم الهروب" (لاف).

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

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

splitenv --on ' ' LESS
splitenv --on ':' PYTHONPATH

تلعب هذه الاستدعاءات الآن الأدوار المزدوجة المتمثلة في استيراد أي متغير موجود ، وتحديد كيفية تصديره. ما رأيك؟

أيضًا ، هل هناك طريقة للقيام بذلك بدون تحرير config.fish؟ ربما كجزء من المتغيرات العالمية؟

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

يبدو ذلك جيدا. على الرغم من أنه في هذه المرحلة ، ربما لن يساعد إنشاء برنامج نصي من splitenv ، لأننا سنحتاج إلى تعاون من جانب C ++ على أي حال.

تلعب هذه الاستدعاءات الآن الأدوار المزدوجة المتمثلة في استيراد أي متغير موجود ، وتحديد كيفية تصديره.

من المحتمل الآن أن "splitenv" لم يعد الاسم المثالي بعد الآن (كان ذلك عندما فكرت فيه ، بالطبع: يضحك :) - لقد فكرت أيضًا في "استمع".

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

يمكن للمستخدمين ترميز السلاسل باستخدام مثال set SOMEPATH (string split : $SOMEPATH) .

لم يتم توثيق الأمر string في أي مكان يمكنني العثور عليه. أيضًا ، يعرض man string صفحة الدليل للسلسلة (3) التي توثق وظائف معالجة السلسلة على BSD (و Mac OS X).

ولكن إذا قمنا بالتصدير بمسافات ، فسيظهر هذا 1 للمكالمة العودية. كما تقول نحن لا نعتمد على هذا ، لكنه لطيف من وجهة نظر الاتساق.

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

والذي يظهر في قضايا مثل # 2090

أنا آسف ولكني لا أرى أي ميزة لشكوى هذا المستخدم. تم حل المشكلة بشكل تافه عن طريق الاختبار الصريح لما إذا كان MANPATH قد تم تعيينه بالفعل. يبدو لي أنه شيء عليك القيام به في أي حال بالنظر إلى دلالات النقطتين المتقدمتين مقابل النقطتين اللاحقتين.

لذلك قد يتم كسر إدخالات $ PATH بداخلها نقطتان

لقد فات الأوان على الأقل ثلاثين عامًا لإصلاح ذلك. لا ينبغي أن ننفذ الهروب من النقطتين (وبالتالي حرف الهروب) لأن هذا سيكون سلوكًا غير قياسي. حتى وقت قريب ، أمضيت أكثر من 20 عامًا كمتخصص في دعم UNIX. لم أسمع أبدًا أي شخص يشتكي من أن وجود علامة النقطتين في دليل مضمن في $ PATH أو متغير مشابه يمثل مشكلة.

سيكون الحل المفضل لدي هو وظيفة مثل splitenv var1 var2 var3

هذا جيد على الرغم من أنه ليس من الواضح سبب عدم كفاية string split (غير الموثق). بغض النظر عما إذا كنا بحاجة إلى وظيفة جديدة ، لا ينبغي بالتأكيد إضافة أي متغيرات بيئية جديدة ذات تقسيم تلقائي. النوعان الوحيدان الشائعان بدرجة كافية لضمان هذا السلوك هما PATH و CDPATH (و MANPATH منذ أن كان غلافًا خاصًا بالفعل). يمكن تقسيم المتغيرات الأخرى مثل PYTHONPATH بشكل صريح بواسطة المستخدم إذا وجد ذلك مفيدًا.

ومع ذلك ، بعد أن قلت أنه يجب أن تكون هناك بالتأكيد طريقة لتسجيل أن var (على سبيل المثال ، PYTHONPATH) يجب أن تكون عناصره متسلسلة مع حرف فاصل معين عند تصديره. الطريقة الأكثر طبيعية للقيام بذلك هي عبر خيار جديد للأمر set . علي سبيل المثال،

set -x -S ':' PYTHONPATH dir1 dir2 dir3

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

echo "PYTHONPATH is $PYTHONPATH"

يجب استخدام نقطتين بدلاً من مسافة لتسلسل قيم PYTHONPATH. الفاصل الافتراضي هو مساحة للحفاظ على الدلالات الموجودة وتقليل المفاجأة للمستخدم. لاحظ أن المتغيرات ذات الغلاف الخاص مثل PATH ستستخدم أيضًا نقطتين في هذا المثال. وهو ما يتعارض مع السلوك الحالي ولكنه يتفق مع الدلالات الجديدة وأقل إثارة للدهشة. بمعنى آخر ، لماذا يتم فصل عناصر $ PATH بنقطتين في البيئة المُصدرة ولكن مسافات في ناتج

echo "PATH is $PATH"

لم يتم توثيق أمر السلسلة في أي مكان يمكنني العثور عليه. أيضًا ، تعرض سلسلة man السلسلة (3) صفحة الدليل التي توثق وظائف معالجة السلسلة على BSD (و Mac OS X).

نمر سهل. إنه موجود في إصدارات التطوير - راجع https://github.com/fish-shell/fish-shell/blob/master/doc_src/string.txt

هذا جيد على الرغم من أنه ليس من الواضح سبب عدم كفاية تقسيم السلسلة (غير الموثق).

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

الطريقة الأكثر طبيعية للقيام بذلك هي عبر خيار جديد للأمر set.

هذا خيار آخر ، على الرغم من أنني لست مبيعًا تمامًا للدلالات. على سبيل المثال ، set -S ':' PYTHONPATH . هل سيؤدي ذلك إلى تعيين PYTHONPATH على القائمة الفارغة أم أنه سيؤدي فقط إلى تقسيم PYTHONPATH الحالي؟ حتى الآن ، قامت جميع خيارات المجموعة بالأول ، لذلك عليك القيام بـ set -S ':' PYTHONPATH $PYTHONPATH . أو نجعلها _ لا_ تفعل ذلك ولدينا تناقض داخل نفس الأداة.

بمعنى آخر ، لماذا يتم فصل عناصر $ PATH بنقطتين في البيئة المُصدرة ولكن مسافات في الناتج echo "PATH is $PATH"

هذا في الواقع سؤال جيد. بالطبع لا تتوقع أن يظهر الفاصل على سبيل المثال for p in $PATH; echo $p; end ، لكن ربطه بالفاصل لكل متغير قد يكون الشيء الصحيح الذي يجب فعله. بالطبع هناك string join للقيام بذلك يدويًا.

هذا السلوك ، مع ذلك ، مثير للدهشة. أنا على استعداد للمراهنة على أنه إذا سألت 100 شخص عما يحدث عندما يتم تصدير var مع أكثر من عنصر واحد ، فإن 90 منهم سيقولون إن القيم متسلسلة مع مسافة كفاصل.

هناك مشكلة عامة في إجراء التصميم تلو الآخر والأسماك. لأن الأشخاص الذين شملهم الاستطلاع غالبًا ما يكون لديهم معرفة بـ bash (وبدرجة أقل قذائف POSIXy الأخرى) بينما فكرة الأسماك هي القيام بشيء _ أفضل _ من خلال التخلي على الأقل عن بعض POSIX.

هذا لا يعني أنه لا قيمة له تمامًا ، إنه مجرد شيء يجب أن نضعه في الاعتبار - إذا تمسكنا بهذه الأنواع من الأفكار ، فسنكون لدينا سلوك bash لتقسيم الكلمات و if-fi.

هل سيقوم set -S ':' PYTHONPATH بتعيين PYTHONPATH إلى القائمة الفارغة أم أنه سيقسم فقط PYTHONPATH الحالي؟

سيضعها على قائمة فارغة. إذا أراد المستخدم الاحتفاظ بالقيمة الحالية ، فعليه تضمينها صراحةً (انظر أدناه).

لدينا بالفعل جميع الإمكانات المطلوبة باستثناء وسيلة لتهيئة الحرف (أو السلسلة الفارغة) لاستخدامها عند ربط عناصر مصفوفة من var معين للتصدير أو الاستيفاء. إذا أراد شخص ما التلاعب بـ var مثل PYTHONPATH ، فيمكنه إما التعامل معها كسلسلة بسيطة:

set PYTHONPATH "/a/new/dir:$PYTHONPATH"

أو يمكنهم معاملتها كمصفوفة:

set -S ":" PYTHONPATH /a/new/dir (string split ":" $PYTHONPATH)

لاحظ أن اقتراحي باستخدام حرف الانقسام / التسلسل بدلاً من مسافة عند الاستيفاء في سلسلة يوفر سلوكًا ثابتًا بغض النظر عما إذا كان المستخدم يقسم var إلى مصفوفة أم لا.

أنا بالتأكيد لا أقترح التصميم من قبل اللجنة. بهذه الطريقة يكمن الجنون والخداع مثل zsh. أنا ببساطة أشير إلى أنه عند تقديم خيارين أو أكثر بدون سبب آخر لاختيار أحدهما على الآخر ، فإن اختيار الخيار الذي سيفاجئ مستخدم الصدفة على الأقل هو الخيار الأفضل. وهذا أيضًا سبب معارضتي (في الوقت الحالي) لإدخال أوامر أو سلوكيات جديدة مثل تقسيم vars تلقائيًا (بخلاف PATH و CDPATH بالطبع). هذا هو نوع الشيء الذي يتم القيام به بشكل غير متكرر وعادة فقط في config.fish وبعض الوظائف المتخصصة مثل نص Anaconda's "activated". والطريقة لجعل الأخير يتصرف بشكل صحيح بغض النظر عما إذا كان المستخدم قد قام بالفعل بتقسيم var إلى مصفوفة في config.fish الخاص به ، هو معاملته دائمًا كسلسلة يجب تقسيمها. على سبيل المثال ، إذا كان يلزم تعديل PYTHONPATH ، فقد يفعل شيئًا كالتالي:

# Hypothetical snippet from the Anaconda activate script.
if test (count PYTHONPATH) -gt 1
    set -S ':' PYTHONPATH /activated/python/tree $PYTHONPATH
else
    set PYTHONPATH "/activated/python/tree:$PYTHONPATH"
end

أو ، بشكل أكثر بساطة ،

# Hypothetical snippet from the Anaconda activate script.
set -S ':' PYTHONPATH /activated/python/tree (string split ':' $PYTHONPATH)

نعم ، من المحتمل أن يحول ذلك ما قد يكون سلسلة بسيطة إلى مصفوفة. ولكن مع قاعدتي التي تنص على أن الحرف المحدد بواسطة المحول -S يُستخدم عند تصدير واستيفاء هذا التحويل إلى مصفوفة يجب ألا يكون مهمًا في الممارسة. ومع ذلك ، هناك قضية زاوية واحدة. ماذا يحدث إذا لم يقم المستخدم صراحة بتحويل var إلى مصفوفة في config.fish الخاص به ، ثم يقوم بتشغيل شيء مثل النص الافتراضي أعلاه. من المحتمل أن يصبح var مصفوفة متعددة العناصر مما يعني أنه إذا قاموا بذلك لاحقًا

for elem in $PYTHONPATH
   echo $elem
end

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

tl ؛ أعتقد أن القوائم يجب أن "تتذكر" محدداتها ، وفيما يلي السبب.


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

كمثال (وأنا لا أركز على الطول بقدر ما أركز على عدد الأشياء المتكررة):

  • سمكة: set -S ':' PYTHONPATH /activated/python/tree (string split ':' $PYTHONPATH)
  • الإنجليزية: "إلحاق /activated/python/tree بـ PYTHONPATH ( : -delimited`)"

يوجد شيئين متكررين هنا: PYTHONPATH والمحدد : . يمكن القول إن تكرار PYTHONPATH مقبول لسببين ، ولا ينطبق أي من هذين السببين على المحدد.

  1. ليس من الصعب تحديد ما يحدث عندما يقول شخص ما set PYTHONPATH /activated/python/tree $PYTHONPATH ، لأن هذا مشابه جدًا لأشياء مثل i = 2 + i ، وهو مفهوم / لغة مألوفة جدًا. (ولكن لا يزال لدينا اختصارات مثل += ، ولهذا السبب أقترح علامة --append أدناه.) من ناحية أخرى ، عندما يفكر الأشخاص في إلحاق قائمة ، فإنهم لا يفكرون في الانقسام والانضمام على محدد. لا يفكرون في تحويل القائمة بأكملها إلى تنسيق آخر ، والقيام بالعملية الحقيقية عليها ، وإعادتها مرة أخرى. في أذهانهم ، قرأوا المحدد بشكل طبيعي كمحدد بدلاً من تغييره إلى محدد "داخلي" أو "مفضل".
  2. يؤدي استخدام الأمر العادي set للإلحاق إلى حفظ إضافة أمر آخر للانضمام إلى قائمتين مختلفتين. من ناحية أخرى ، فإن التحويل من محدد إلى آخر هو أمر لا نريده من الناحية المثالية أن يقوم به المستخدم يدويًا ، غالبًا للسبب أعلاه.

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

# Changes the delimiter for this list. This might be done in some global config file for common lists as this one.
set -S ':' --no-modify PYTHONPATH
# or, workaround if you don't want to add extra options to set:
set -S ':' PYTHONPATH $PYTHONPATH

# The actual append operation
set --prepend PYTHONPATH /activated/python/tree
# or, workaround if you don't want to add extra options to set:
set PYTHONPATH /activated/python/tree $PYTHONPATH

التداعيات / أسئلة المتابعة / إلخ:

  1. هذا متوافق إلى حد ما مع الاقتراح الحالي. فيما يلي التغييرات المطلوبة:

    • اجعل المحدد ثابتًا (ربما باستخدام متغير آخر مثل __fish_sep_PYTHONPATH )

    • (اختياري) أضف علامة أتصل بها حاليًا --no-modify ، والتي تخبر الأسماك بتغيير محدد القائمة دون تغيير محتوياتها. من المحتمل أيضًا إضافة علامات --append و --prepend بسبب السبب (1) أعلاه. على أي حال ، هذا ليس مطلوبًا ، كما يوضح الحل أعلاه ، على غرار كيفية الإلحاق والتثبيت المسبق في الأسماك اليوم.

  2. في الأسماك ، يجب أن تتم معاملة القوائم على الأقل كمواطنين من الدرجة الأولى. هذا يعني أن تغيير المحدد يجب أن يغير تمثيل السلسلة ، وليس تمثيل القائمة (ما لم يكن المحدد موجودًا في أحد العناصر ، وفي هذه الحالة يكون الانقسام هناك أمرًا لا مفر منه). على سبيل المثال ، إذا كنت تقوم بتغيير المحددات من , إلى : ، يجب أن يصبح $ # ["0:1", "2"] ["0", "1", "2"] وليس ["0", "1,2"] (وهو ما سيحدث إذا قمت ببساطة بتغيير المحدد دون تغيير السلسلة التي تدعم القائمة). يجب أن يزيد هذا السلوك التوافق مع السلوك الحالي وحقيقة أن هناك حاليًا محددًا افتراضيًا غير قابل للتغيير.

هنا هو بيت القصيد:

  • يتضمن هذا عددًا أقل من الرموز المميزة ، ولا يتكرر أي شيء تقريبًا.
  • هذا يوازي النموذج العقلي لدى العديد من المستخدمين. يفكر المستخدمون في هذه المصطلحات: "قبل" ، "تعيين المحدد" ، "لا تعدل".
  • يبدو أن هذه هي الطريقة الصحيحة الوحيدة للقيام بهذه المهمة (الطريقة القديمة تبدو الآن خرقاء للغاية) ، وبالتالي فإن هذه الإضافات لا تدمر التعامد.
set --no-modify -S : PYTHONPATH
set --prepend PYTHONPATH /activated/python/tree

شكرًا لك ، szhu ، على التعليق التفصيلي بشأن اقتراحي. ومع ذلك ، هناك العديد من المشاكل مع الحل المقترح الخاص بك. على سبيل المثال ، تؤدي إضافة الخيار - no-modification في الواقع إلى تعديل المتغير عن طريق تحويله إلى قائمة وبالتالي تعديل المتغير. بينما أرفض جميع عناصر اقتراحك تقريبًا ، فقد جعلني أفكر في حل أكثر وضوحًا من شأنه أن يعالج معظم ، إن لم يكن جميع ، نقاطك. ربما يجب أن تكون هناك آلية لإخبار الأسماك أنه يجب دائمًا تقسيم شكل var معين تلقائيًا وإعادة تكوينه على رمز معين (على سبيل المثال ، ":" أو ""). قد يسمى هذا تعيين مصفوفة تلقائية وعند التنفيذ ، سيتم تقسيم أي قيمة موجودة على الفور إذا لم تكن مصفوفة بالفعل.

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

set -x -A ':' PYTHONPATH

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

set PYTHONPATH /a/path /b/path /c:/d/path

لكن ماذا عن تلك الحجة الأخيرة؟ هل يجب تقسيمها تلقائيًا إلى رمزين؟

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

set -x -A ':' PYTHONPATH 'hello:goodbye' $PYTHONPATH

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

@ krader1961 ، شكرا لاستجابتك. ومع ذلك ، يبدو أنك تعتقد أنني أقوم بتحويل المتغيرات من سلاسل إلى قوائم. أعتقد أنك تسيء فهم مفهوم واحد مهم في الأسماك: كل متغير هو قائمة من السلاسل . المتغيرات التي تظهر على أنها سلاسل هي في الواقع قوائم بطول 1. تعاملها الأسماك بشكل لا يختلف عن قوائم الطول 0 أو 2 أو أي طول آخر.

لاحظ أيضًا أنه على الرغم من أن السلسلة الأساسية المستخدمة لتمرير متغيرات البيئة قد تتغير عند تغيير المحددات ، فإن أحد ثروات الأسماك هو أن المستخدم عادةً لا يحتاج إلى التفكير في المحددات على الإطلاق. هذا هو السبب في أنني أوصي بأن كل خيار -S هو تحديد كيفية تحويل هذه القائمة إلى سلسلة عندما يتم تصديرها من الخارج إلى الأسماك. يجب ألا يغير -S تمثيل قائمة in-fish (باستثناء الحالات التي يكون فيها من المستحيل تمثيل تلك القائمة باستخدام محدد الهدف).

بالمناسبة ، إليك مثال واحد يوضح مدى نظافة اقتراحي. هذا هو الكود لتحويل المتغير $L مرة أخرى إلى المحدد الافتراضي \x1e . لن يكون لها أي تأثير على الإطلاق على أي متغير (أي نطاق ، أي عدد من العناصر) يمكن إنشاؤه في الأسماك اليوم.

set -S \x1e L $L

شيء آخر: مجموعة الوسائط --no-modify مجرد اختصارات. فيما يلي معادلاتهم:

| الاختصار | مكافئ |
| --- | --- |
| set [other args] --no-modify L | set [other args] L $L |
| set [other args] --prepend L $TOADD... | set [other args] L $TOADD... $L |
| set [other args] --append L $TOADD... | set [other args] L $L $TOADD... |

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

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

szhu إنني أدرك تمامًا أن جميع vars في الأسماك عبارة عن قوائم تحتوي على قيم صفرية أو قيمة واحدة أو أكثر. من الواضح أيضًا أنك لم تقرأ تعليقاتي السابقة حيث أصرح بوضوح أن المحدد المرتبط يجب ألا يؤثر على التمثيل الداخلي أو كيفية استمرار القيم في مخزن البيانات العالمي (بخلاف تخزين المحدد). أنت أيضا لم تعالج نقاطي السابقة. ضع في اعتبارك مثالك الأخير:

set -S \x1e L $L

ماذا يجب أن يفعل إذا كان L يحتوي بالفعل على قيمتين أو أكثر؟ من المفترض أن لا شيء سوى تغيير المحدِّد المرتبط. هل ستكون الوسيطة $ L اختيارية في هذه الحالة؟ أم يجب أولاً تحويل المصفوفة الموجودة إلى سلسلة بسيطة (من المفترض أن تكون متسلسلة باستخدام المحدد الحالي) ثم تقسم تلك السلسلة على المحدِّد الجديد؟ كما قلت من قبل ، الشيطان يكمن في التفاصيل.

في نهاية المطاف ، سيقرر المصممون والمشرفون المعتمدون ما إذا كان يجب إضافة مجموعة --no-modify أم لا ، لكنني أصوت بلا لأنهم لا يضيفون قيمة كافية في رأيي بالنسبة لتكلفتها.

آسف ، هذا الموضوع طويل ، لا بد أني فاتني اعترافك بهذا أعلاه ؛ من الجيد معرفة أننا في نفس الصفحة! أعتقد أنني عالجت معظم مخاوفك المذكورة أعلاه أيضًا ، ولكن ليس كلها. سأتناول على وجه التحديد كل من مخاوفك أدناه.


1. هل $L اختياري في set -S \x1e L $L ؟

لن يتغير السلوك الحالي لـ set . في ظل السلوك الحالي ، لا يغير $ # $ set L $L L و set L يجعل L قائمة فارغة. نفس الشيء مع set -S \x1e L $L و set -S \x1e L .

1.1 ألا يبدو set -S \x1e L $L مفرطًا في الإسهاب لتغيير المحدد فقط؟

بعض الشيء. لهذا السبب أقترح الخيار --no-modify كاختصار لذلك.

لكن خطتي لن تنهار إذا لم يكن هذا الاختصار موجودًا. نتعامل بالفعل مع هذه المشكلة كل يوم عندما نلحق القوائم: set PATH ~/.bin $PATH . لهذا السبب ، وللسبب نفسه ، أقترح --prepend و --append أيضًا.

2. كيف ستتم عملية التحويل؟

لنفترض أن المحدد القديم هو \x1e وأن المحدد الجديد هو : ، وأن لدينا قائمة أسماك ["hello", "world"] (تم تصديره كـ hello\x1eworld ). هناك طريقتان أساسيتان لإجراء التحويل (" خيارات التحويل "):

  1. استخدم ["hello", "world"] وقم بتحويله إلى ["hello", "world"] (تم تصديره كـ hello,world )
    ميزة: تمثيل القائمة لا يتغير.
  2. استخدم hello\x1eworld وقم بتحويله إلى ["hello\x1eworld"] (تم تصديره كـ hello\x1eworld )
    ميزة: تمثيل القيمة المصدرة لا يتغير.

لاحظ أن هذا من منظور واجهة المستخدم ، وليس من منظور التنفيذ ؛ نحن نتحدث عما يبدو عليه الأمر للمستخدم. سأغطي التنفيذ في السؤال التالي. _ ملاحظة: بقية هذه الإجابة هي أشياء جديدة لم أتطرق إليها أعلاه ، مدفوعة بأسئلتك. شكرا!_

داخل الأسماك. أولاً ، إذا كنا نعمل بشكل كامل في مجال الأسماك ، فإن القوائم من الدرجة الأولى ولا داعي للقلق بشأن المحددات ، وبالتالي فإن كلاهما غير مطلوب. (مرة أخرى ، كلمة "should" من منظور المستخدم ، كمطورين ، تقع على عاتقنا مسؤولية جعل هذا صحيحًا.)

تغيير تنسيق تصدير vars. وبالتالي ، فإن السبب الوحيد الذي يجعل المستخدم يحتاج إلى تغيير المحددات هو تغيير السلسلة المصدرة للبرامج التي تقرأ متغيرات البيئة. بالنسبة للقوائم التي تم إنشاؤها في الأسماك ، سنستخدم بالتأكيد خيار التحويل 1 ، لأن معنى المتغير كقائمة مهم ومحدد جيدًا ، لذلك نحتاج إلى الحفاظ على تمثيل القائمة.

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

2.1 كيف سيتم تنفيذ ذلك؟

الأسماك على الرغم من أن المستخدم لا يحتاج إلى معرفة ذلك ، تقوم الأسماك بالفعل بتخزين القوائم كسلاسل. يتم تخزين المتغير x على هيئة hello\x1eworld . بموجب اقتراحي ، سيكون هناك متغير آخر ، __fish_delimiter_x ، الذي يحدد محدد المتغير x . إنه غير موجود حاليًا ولذلك نستخدم المحدد الافتراضي ، \x1e .

لخيار التحويل 1:

  1. قسّم المتغير على المحدِّد القديم ، مما ينتج عنه قائمة حقيقية بلغة التنفيذ (C ++).
  2. انضم إلى القائمة باستخدام المحدد الجديد ، مما ينتج عنه سلسلة جديدة.
  3. احفظ المحدد الجديد في __fish_delimiter_x .

بالنسبة لخيار التحويل 1 ، تنفيذ مكافئ:

  1. في المتغير ، استبدل كل تكرارات المحدِّد القديم بالمُحدِّد الجديد.
  2. احفظ المحدد الجديد في __fish_delimiter_x .

لخيار التحويل 2:

  1. احفظ المحدد الجديد في __fish_delimiter_x .

2.2 إذا احتجنا إلى كلا خياري التحويل ، فكيف يمكن للمستخدم تحديد أيهما يستخدم؟

ربما يمكننا الحصول على خيارين: -D أو --convert-delimiter للخيار 1 و -d أو --set-delimiter للخيار 2.

2.3 هل نحتاج حقًا إلى كلا الخيارين؟

في ظل الأسماك الحالية ، نختار أن نفترض أننا لن نرى \x1e في البرية خارج الأسماك. إذا احتفظنا بهذا كمحدد افتراضي واحتفظنا بهذا الافتراض ، فإن خيار التحويل 1 يكون كافيًا لكل من التحويل وتعيين المحدد ولن نحتاج إلى خيار التحويل 2 . (الطريقة السهلة للاقتناع بذلك هي إدراك أنه إذا كان الافتراض صحيحًا ، عند تحويل القوائم التي تم إنشاؤها خارجيًا ، فإن خطوة خيار التحويل 1 "استبدال جميع تكرارات المحدِّد القديم بآخر جديد" لن تفعل شيئًا ، مما يقلل التحويل بالكامل إلى خيار التحويل 2.)


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

يبدو أن هناك قضيتين هنا. دعنا نتحدث فقط عن أول واحد؟

+1 لمجموعة صحيحة

هل هذه الحيلة الفاصلة مطلوبة حقًا للأسماك؟ بينغ # 627

إعادة النظر في هذا في ضوء إصلاحي للمشكلة رقم 2106 حيث لاحظت وجود طريقتين غير متوافقين لتحويل تمثيل السلسلة للقيم المتغيرة إلى مصفوفات. أحدها حذف العناصر الفارغة بشكل غير صحيح. المشكلة الأساسية هي أن class env_var_t يعتمد على wcstring بدلاً من ناقل wcstring. سواء كان تغيير ذلك يستحق الجهد أم لا ، فهو مفتوح للنقاش.

إذا كنت تتابع هذه المشكلة ، فأنا أشجعك على إلقاء نظرة على PR # 4082 وربما اختباره. قررت أن أفضل طريقة لمعالجة هذا هو المتغيرات "المقيدة" المشابهة للميزة بنفس الاسم في zsh.

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

للتلخيص: متغيرات بيئة يونكس عبارة عن سلاسل ، لذا يجب أن تستخدم متغيرات البيئة التي تشبه المصفوفة محددًا. معظم استخدام النقطتين ($ PATH) ؛ على الرغم من أن الجميع لا يفعلون ذلك (أقل من دولار). نود فقط استخدام النقطتين لتحديد كل المصفوفات عند الاستيراد / التصدير (وفي الواقع كانت الأسماك تعمل بهذه الطريقة) ؛ المشكلة هي أن بعض المتغيرات الثابتة تحتوي على نقطتين (DISPLAY $ ، SSH_CONNECTION $).

الهدف هو جعل المتغيرات المحددة تعمل بشكل طبيعي مع دعم مصفوفة الأسماك. اقترح szhu تحسين set لتتبع المحدد ، لكن تحسين IMO set هو المكان الخطأ لإرفاق هذا:

  • تفاعل مزعج بين ضبط المتغير وتعيين محدده (تحفيز --no-modify ).
  • أسئلة صعبة حول كيفية تفاعل المحددات مع النطاق المتغير.
  • مشاكل حول المتغيرات العالمية. سيتعين علينا تعليم uvars أن نتذكر المحدد ، وكذلك حول --no-modify لأنه لا توجد طريقة لتعيين متغير على قيمته الحالية مع uvars.

عند المراجعة ، أفضّل فكرة Splitenvfaho . splitenv name يقسم المتغير الحالي على نقطتين ، هذا كل شيء. إنه أمر بسيط بشكل رائع. المتغيرات التي لا تستخدم النقطتين نادرة لدرجة أننا لا نحتاج إلى دعم خاص لها.

الجانب السلبي هو أنه سيتم إعادة استيراد مصفوفات الأسماك المصدرة كسلسلة محددة بنقطتين ؛ من الناحية العملية أعتقد أن هذا سيكون نادرًا.

يجب ألا نلحق هذا التعقيد splitenv بالمستخدمين إذا أمكننا تجنبه. لذلك أريد أن أخطو خطوة أخرى إلى الأمام ، وأوسع قائمة النقطتين البيضاء لتشمل جميع متغيرات البيئة التي ينتهي اسمها بـ PATH ، مثل LD_LIBRARY_PATH ، PYTHONPATH ، إلخ. عمليًا ، يجب أن يفعل هذا الشيء الصحيح في كل الأوقات تقريبًا ؛ يمكن لأي شخص يعضه استخدام string join لإصلاح القيمة.

إذن ما أقترحه (اقتراح فاهو حقًا):

  • تصدير كافة المصفوفات باستخدام النقطتين ؛ لا مزيد من فاصل سجل ASCII.
  • قم بتنفيذ دالة splitenv تقسم متغيرًا على نقطتين. يمكن كتابة هذا بخط الأسماك.
  • قم بتحسين القائمة البيضاء المفصولة بنقطتين لجميع المتغيرات التي تنتهي بـ PATH.

أعتقد أن هذا سيعالج معظم الألم المرتبط بالمصفوفات المحددة بالقولون بطريقة بسيطة ومتوافقة.

فيما يتعلق بفكرة Splitenv:

لنفترض أنني أردت من الأسماك تصدير قائمة تحتوي عناصرها على نقطتين ، على سبيل المثال: ["item1", "item:2"] . (لا أعتقد أن هذا أمر نادر الحدوث ، خاصةً عند استخدام المصفوفات لتخزين مدخلات المستخدم.)

هل سيتم تصدير القائمة كـ item1:item:2 ؟ إذا كان الأمر كذلك ، فسيكون من المستحيل إعادة إنشاء القائمة الأصلية بعد التصدير.

أيضًا ، وجود قائمة بيضاء غير قابلة للتغيير للمتغيرات يبدو أمرًا خاطئًا ، على الرغم من أن وجود القائمة البيضاء *?PATH يبدو أقل خطأ. (كان هذا سببًا آخر لاقتراحي بتخزين المحدد كمتغير - يمكن تغيير القائمة البيضاء عن طريق تعيين متغير.)

szhu أنت بخير. القوائم المصدرة لا يمكن احتوائها على النقطتين هي مشكلة يعاني منها يونكس بالفعل :

حيث \

لذلك لا أشعر بالسوء حيال تقديم نفس القيد للأسماك (للمتغيرات المصدرة فقط).

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

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

هذا مثال تم اختراعه جزئيًا فقط:

set -x TEST color:red 
set -x TEST2 color:red font:serif
set -x TEST_PATH color:red 
set -x TEST2_PATH color:red font:serif
exec fish
echo $TEST #=> color:red
echo $TEST2 #=> color:red:font:serif
echo $TEST_PATH #=> color red 
echo $TEST2_PATH #=> color red font serif

أستطيع أن أتخيل أن الكثير من المستخدمين الجدد يتعرضون للارتباك بعد ملاحظة ما سبق.

أعتقد أن السلوك التالي سيكون أكثر متعة:

set -x TEST color:red 
set -x TEST2 color:red font:serif
set -x TEST_PATH color:red 
set -x TEST2_PATH color:red font:serif
exec fish
echo $TEST # color:red
echo $TEST2 # color:red font:serif
echo $TEST_PATH #=> color:red 
echo $TEST2_PATH #=> color:red font:serif

أود أن تكون أفكارك وأفكارك المجتمع حول هذا الأمر.

لماذا لا تهرب من النقطتين الموجودة؟ هذا من شأنه أن يحافظ على التمييز.

الهروب منطقي بالنسبة لي.

هل يمكن أن يظل محيرًا أنه لن يتم تذكر ما إذا كان المتغير عبارة عن مصفوفة؟

set -x TEST2 color:red font:serif
set -x TEST2_PATH color:red font:serif
exec fish
echo $TEST2 # color\:red:font\:serif
echo $TEST2_PATH #=> color:red font:serif

نعم. فرضيتي هي أن تصدير المصفوفات ليس شائعًا ، خارج قوائم المسار.

MANPATH لها معنى خاص للنقطتين المزدوجة (: :) - راجع # 2090 - هل هذا يرمي مفتاح ربط في الأعمال؟

أود أن أزعم أيضًا أن وجود متغير جانبي FISH_ARRAY_VARIABLES=FOO\t:\nBAR\t;\nBAZ\t-\n في أي حال سيكون تلميحًا جيدًا لحالات استدعاء Fish لالتقاط متغيرات المصفوفة مرة أخرى ، دون إزعاج العمليات الأخرى ودون الحاجة إلى "نحن سمكة ملتوية الآن "لعبة الداما ..

إعادة: https://github.com/fish-shell/fish-shell/issues/436#issuecomment -392409659zanchey
لم أقرأ # 2090 بالتفصيل ، لكنني أعتقد أن التحويل بين سلسلة نصية محددة بنقطتين ونماذج مصفوفة أمر سلس تمامًا (باستثناء عندما لا تظهر النقطتان ~ تظهر في عناصر المصفوفة).

لتضمين نقطتين في MANPATH ، أضف سلسلة فارغة حيث يجب أن تظهر النقطتان المزدوجة:

$ set -x MANPATH 1 2 '' 3
# Check if it's set
$ bash -c 'echo $MANPATH'
1:2::3

لبدء MANPATH بنقطتين ، فقط أضف عنصر سلسلة فارغ إلى البداية:

$ set -x MANPATH '' 1 2 3
# Check if it's set
$ bash -c 'echo $MANPATH'
:1:2:3

لم أتابع كل شيء هنا ، لكني كمستخدم أريد أن أدافع عن "عدم التهيئة".
أعتقد أن set -S و splitenv هي أشكال من التكوين. يقوم بعض المستخدمين بعملها في fish.config والتعامل مع PYTHONPATH كمصفوفة. لن يتعامل الآخرون مع PYTHONPATH ككلمة مفصولة بنقطتين. عندئذٍ لن تعمل دائمًا نصيحة تكديس النسخ واللصق وتشغيل البرامج النصية التي تتعامل مع PYTHONPATH من مستخدم إلى آخر ...

قاعدة "إذا انتهى بـ PATH " تكون خالية من التكوين وتبدو مثالية بقدر ما يمكنك الحصول عليها: +1:
(ليس لدي رأي حول ما إذا كان الأمر يستحق عدم التوافق مع الإصدارات السابقة)
نعم ، سيتم استيراد $ # set -x TEST2_PATH color:red font:serif كمصفوفة color red font serif ولكن هذا هو التعامل مع تصدير المتغيرات. لا يمكنك بالفعل تعيين var مُصدَّر إلى مصفوفة دون فهم كيفية عملها.

نعم. فرضيتي هي أن تصدير المصفوفات ليس شائعًا ، خارج قوائم المسار.

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


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

ridiculousfish أعتقد أن أحد الحلول الممكنة هو ربط كل متغير / مصفوفة بيئة بفاصل خاص به (ويمكنك الاحتفاظ بـ '\x1e' أو ' ' أو ':' كالفاصل الافتراضي) ، ويكون المستخدم الذي أنشأ متغير البيئة مسؤولاً عن اختيار الفواصل المناسبة لتجنب التعارضات. قد يكون الأمر مثل: set --separator ':' TMP 1 2 3 . وبالتالي بالنسبة لمتغيرات البيئة المعروفة ، يمكن للمستخدمين فقط اختيار الفواصل المشهورة المقابلة والتي يمكن التعرف عليها أيضًا بواسطة البرامج الأخرى ويمكن أن تجعل الأسماك أكثر توافقًا مع المزيد من البرامج (مثل Python).

بالنسبة لأولئك الذين يقرؤون التعليقات الأخيرة فقط ، ما عليك سوى ملاحظة أن توصيةthuzhf set --separator هي نفس التوصية set -S التي تم ذكرها مرارًا وتكرارًا خلال هذا الموضوع. للحصول على مزيد من السياق حول هذه المناقشة ، يمكنك إنشاء هذه الصفحة مقابل set -S .

szhu آسف لعدم ملاحظة set -S السابق. هذا هو ما أريده أيضًا. كما أنني لاحظت أن هناك العديد من المخاوف التي كانت لدى الآخرين بشأن هذا الخيار الجديد. يمكنني إعطاء أفكاري حول هذه المخاوف أدناه (نظرًا لأن مجموعة الأسماك لم تستخدم -s كخيار ، سأستخدم -s للإشارة إلى --separator فيما بعد):

  1. --no-modify يقوم بتعديل شيء ما. نعم ، ويجب تغيير الاسم ليكون صريحًا ، على سبيل المثال ، --change-separator .
  2. هناك بعض الحالات الركنية / الصعبة. يرجع هذا أساسًا إلى البنية غير المحددة جيدًا ، ويمكن تجنبه بشكل طبيعي إذا قدمنا ​​تعريفًا صارمًا لبناء الجملة. علي سبيل المثال:

    1. الفكرة الأساسية: كل var (قائمة) يقترن بفاصل خاص به عند تعريفه (الافتراضي هو ' ' ). سيتم استخدام هذا الفاصل عندما يتم إنشاء هذا var من سلسلة وعندما يتم تحويله إلى سلسلة (هذه فكرة شائعة في بعض اللغات مثل دالة Python join() ). يتم تحويل var إلى سلسلة عند تصديرها أو عندما يريد المستخدم القيام بذلك.

    2. كيف تصنع ENV Vars



      1. set ENV_VAR a b c . بدون -s ، نختار ' ' كفاصل افتراضي.


      2. set -s ':' ENV_VAR . في هذه الحالة ، يتم تعيين ENV_VAR على أن تكون قائمة فارغة.


      3. set -s ':' ENV_VAR a b:c d e:f . في هذه الحالة ، يجب أن يفهم المستخدمون الذين يكتبون هذا الرمز بوضوح أن ':' هو الفاصل ويفهم أن ENV_VAR ستكون مصفوفة مثل ['a b', 'c d e', 'f'] وسيتم تصديرها كـ 'a b:c d e:f' . ماذا لو كنت تريد أن يبدأ ENV_VAR المُصدَّر بمسافات وينتهي بمسافات؟ يجب استخدام عمليات الهروب مثل: set -s ':' ENV_VAR \ a b:c d e:f\ . ثم ENV_VAR سيكون [' a b', 'c d e', 'f '] وسيتم تصديره كـ ' a b:c d e:f ' .


      4. set -s ':' ENV_VAR a b:c d e:f $ENV_VAR . في هذه الحالة ، يعتمد الأمر على كيفية عمل $ . إذا تم تعريفه على أنه استخراج قيمة السلسلة ENV_VAR بدلاً من القائمة ، فسيكون هذا الأمر هو نفسه مجرد استبدال $ ENV_VAR بقيمة السلسلة الخاصة به المحولة من القائمة السفلية ، وفي هذه الحالة ، set -s ':' ENV_VAR a b:c d e:f:$ENV_VAR هو ربما ما تريده حقًا (لاحظ : بعد f ) ؛ إذا تم تعريفها على أنها استخراج متغير ENV_VAR (وهي قائمة بدلاً من سلسلة) ، فيجب أن تصبح هذه قائمة تمتد العملية كما هو الحال في python. على سبيل المثال ، في الحالة الأخيرة ، إذا كان ENV_VAR هو ['x', 'y'] من قبل ، فإن بعد هذه العملية ENV_VAR سيصبح ['a b', 'c d e', 'f', 'x', 'y'] . ماذا لو كان الفاصل السابق ENV_VAR ليس ':' ؟ في الحالة الأولى ، تقع على عاتقك مسؤولية التأكد من قيامك بالشيء الصحيح ، على سبيل المثال ، ربما يجب عليك استخدام فاصل ثابت عن طريق تغيير الفاصل الأصلي إلى ':' أو عن طريق تغيير الفاصل الحالي ليكون الأصلي. في الحالة الأخيرة ، سيؤدي هذا إلى تعيين فاصل هذه المصفوفة من المصفوفة الأصلية (بغض النظر عن ماهيتها) على ':' .



    3. كيفية تغيير الفاصل



      1. set --change-separator ':' ENV_VAR . في حالة عدم وجود ENV_VAR ، يجب إنهاء البرنامج مع ظهور رمز خطأ غير 0. سهل وصريح بدرجة كافية.



    4. كيفية عرض الفاصل



      1. set --view-separator ENV_VAR .



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

أعتقد حقًا أن هذه المشكلة واضحة وعاجلة

thuzhf : أود أن أقول إنك تبالغ في تقدير ذلك.

أحد الأسباب هو أن مشكلتك في # 5169 كانت مع $ LD_LIBRARY_PATH ، لكن هذه في الواقع ليست قائمة في الأسماك! يجب عليك تعيينه على النحو set LD_LIBRARY_PATH "$LD_LIBRARY_PATH:/some/path" ، تمامًا كما هو الحال في الأصداف الأخرى.

يحول Fish بالضبط ثلاثة متغيرات موروثة / مُصدرة إلى قوائم تلقائيًا:

PATH $ و MANPATH $ و $ CDPATH. وستحتوي هذه القائمة بالضبط على فاصل ":" عند التصدير.

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

faho شكرا على شرحك الواضح. هذا حقا له معنى كبير بالنسبة لي. حسنًا ، يمكنني القول أن هذه المشكلة قد تم حلها بالنسبة لي.

لقد ألقيت نظرة على قضية MANPATH الموضحة في # 2090. السيناريو هو إلحاق manpath بحيث يستمر في استخدام مسارات النظام.

في bash يمكن للمرء أن يكتب هذا كـ export MANPATH="$MANPATH:/new/path" . إذا تم تعيين MANPATH ، فسيتم إلحاقه بها. إذا لم يتم الضبط ، فسيؤدي ذلك إلى إضافة نقطتين ، وهي إشارة خاصة بالرجل لاستخدام دلائل النظام. هذا النحو لا يعمل في الأسماك. المشكلة هي أن MANPATH عبارة عن مصفوفة وبالتالي فإن "MANPATH $" ستحتوي على مسافات بدلاً من النقطتين.

يتيح لنا نهج "المتغيرات المقيدة" الحصول على سبيل المثال fish_manpath كمصفوفة تعكس MANPATH كسلسلة مفصولة بنقطتين. يمكن بناء هذا بالكامل في نصوص الأسماك. ومع ذلك ، نود القيام بذلك لجميع المتغيرات التي تشبه المسار ، وليس فقط MANPATH ، وسيكون ذلك بمثابة انقطاع كبير في التوافق وليس من الواضح كيفية إدارته. كما أنه يحتوي على نفس المشكلات ، على سبيل المثال ، يعد متغير المصفوفة manpath في zsh محرجًا لإلحاقه ، لذلك ليس من الواضح سبب وجوده.

اقتراحي هنا لا يجعل وضع MANPATH أفضل أو أسوأ ؛ أعتقد أن الشيء الذي يجب القيام به هو الرماية ولديك قصة سهلة لإلحاقها بـ MANPATH ، وهي:

set -q MANPATH || set MANPATH ''
set -x MANPATH $MANPATH /new/path

هذا ليس مؤلمًا جدًا للصقه في أسماك التهيئة.

اقتراحي هنا لا يجعل وضع MANPATH أفضل أو أسوأ ؛ أعتقد أن الشيء الذي يجب القيام به هو الرماية ولديك قصة سهلة لإلحاقها بـ MANPATH ، وهي:

ridiculousfish : لقد كنت أفكر في المضي قدمًا خطوة أخرى ، في الواقع: قسّم هذه المتغيرات الخاصة على ":" أيضًا في مهمة ، وانضم إليها بـ ":" بدلاً من المسافة في التوسيع المقتبس.

هذا يعني أنه عندما تفعل set -gx MANPATH "$MANPATH:/new/path" ، تذهب الأسماك وتقوم بالتقسيم تلقائيًا ، مما ينتج عنه ما يعادل set -gx MANPATH "" /new/path .

الآن ، هذا يعني أن ":" لا يمكن أن تظهر في مسار بـ MANPATH $ (و $ PATH ، و $ CDPATH) ، لكنهم لا يستطيعون فعل ذلك على أي حال لأنه قد يؤدي إلى تعطيل المرافق غير السمكية!

سيسمح لنا ذلك أيضًا بإزالة المعالجة الخاصة يومًا ما ، لأنها تضيف طريقة متوافقة للتعامل معها - سيتعين عليك فقط التخصيص بـ : ، واستخدامها مع (string split : -- $MANPATH) ، وسيعمل حتى لو تمت إزالة هذه المعالجة.

faho أنا أعتنق الفكرة - كيف يمكن للمستخدم تحديد متغير على أنه يتلقى هذه المعاملة الخاصة؟ هل سيفعل ذلك splitenv ؟

كيف يمكن للمستخدم تحديد متغير على أنه يتلقى هذه المعاملة الخاصة؟

كانت فكرتي في الواقع هي عدم السماح بوضع العلامات على الإطلاق - فقط اتركها كسلوك خاص لـ $ PATH et al. وهو ما سيتيح لنا الابتعاد عن الاستماع في وقت ما في المستقبل.

ومع ذلك ، فقد أدركت منذ ذلك الحين أن السماح بهذا للمتغيرات الأخرى يساعدنا في المتغيرات الأخرى أيضًا - على سبيل المثال ، لقد قلت من قبل أن محرر $ الخاص بي قد تم تعيينه كعنصر واحد ( set EDITOR "emacs -nw" ) للتوافق مع المتغيرات الخارجية أدوات ، ولكن الأسماك ستحبها بشكل أفضل إذا كانت قائمة.

لذلك من المحتمل أن يكون الخيار _space_ افتراضيًا كمحدد ، إلا إذا كان مشابهًا لـ PATH (وبافتراض أنه إذا كان الاسم ينتهي بـ PATH فمن المحتمل أن يكون مقبولاً).

هل ستفعلها Splitenv؟

لا أحب حقًا تقديم ميزة أخرى مضمنة لهذا الغرض ، لذلك ربما أختار خيار الحجة لتعيين.

أوافق على أن "PATH / MANPATH / CDPATH ذات الغلاف الخاص أمر غريب ؛ نحن بحاجة إلى حل أكثر عمومية".

أقترح أن نوقف مسار الغلاف الخاص / MANPATH / CDPATH. سيتم معاملتها (من قبل المستخدم النهائي للأسماك) كما هي في الأصداف الأخرى. سيكون $ PATH (والآخرون) عبارة عن سلسلة واحدة (أو بلغة الأسماك قائمة بطول 1) مع نقطتين بداخلها. لاحظ أنني أشير إلى تجربة مستخدم الأسماك ، وليس كيفية التعامل مع هذه الأشياء داخليًا ؛ لا أعرف كيف سيبدو التطبيق داخل الأسماك - أعتمد على الآخرين للإشارة إلى أي مشاكل هناك.

من المؤكد أنه سيكون له عيب عدم التوافق مع الإصدارات السابقة ، لكنني أعتقد أنه سيكون يستحق ذلك باعتباره مكسبًا كبيرًا في البساطة والأناقة. أعتقد أنه سيتناول # 2090 أيضًا.

ماذا يعتقد الجميع؟

تم دمج 5245 ، لذا يبدو أن هذا قد تم حله.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات