سؤال في bash ، كيف يمكنني الهروب من علامة التعجب؟


أريد أن أفعل شيئًا مثل bzr commit -m "It works!". يمكنني الهروب من علامة التعجب من خلال العمل bzr commit -m "It works\!". ومع ذلك ، فإن رسالة الإلتزام الخاصة بي تتضمن الخط المائل العكسي (Backslash). كيف أهرب من علامة التعجب ، بينما لا زلت أتجاهل الخط المائل للخلف؟


165
2018-04-22 18:53


الأصل


فعل bzr commit -m "It works"! يعمل أيضا. - kba
كما لاحظت من قبل الأمر الذي تضعه في الواقع يعمل على نفسه :) bzr commit -m "It works!" - h4unt3r
حالة حتى quirkier مع اقتباسات متداخلة: stackoverflow.com/questions/22125658/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
على الرغم من أن الإجابة المقبولة هي حل جيد لمشكلات الالتزام الخاصة بك ، إلا أنني أشعر أنها ليست إجابة على المشكلة الفعلية: توسع تاريخ باش. يرجى النظر في قبول إجابة دنيس؟ - Arjan


الأجوبة:


نظرًا لأنك لا تعتمد على bash لتوسيع المتغيرات في رسالة الالتزام ، فيمكنك استخدام علامات الاقتباس الفردية بدلاً من ذلك. لا يتم توسيع سلاسل في علامات الاقتباس المفردة بواسطة bash.

bzr commit -m 'This does work!' 

136
2018-04-22 19:31



بما أن السؤال كان "كيف أهرب من علامة التعجب؟" وليس "كيف لا أقوم بتوسيع علامة التعجب؟" لا أعتقد أن هذا صحيح. هناك بعض الأوقات (مثل عند تمرير apostrophes وعلامات التعجب في سطر الأوامر نفس) أن هذا لا يعمل. الجواب أدناه يعمل بشكل أفضل بكثير للقيام بما يحتاجه الكثير من الناس. - Jann
Jann: أنت على حق بنسبة 100٪ ، ولكني أعتقد أن المشكلة هنا هي المشكلة التي تحتوي على العديد من الأسئلة حول مستخدم متميز: هل نجيب على السؤال إلى هذه النقطة ، أم أننا نساعد الأشخاص في حل مشكلتهم المحددة. أعتقد أن كلتا الطريقتين يمكن أن تكون مفيدة ، وكان هذا يبحث عن مساعدة بشأن قضية محددة. - Benjamin Bannier
توش! كانت هذه قضية محددة. أنا فقط أميل إلى رغبتي في الإجابة على أسئلتي لتكون قادرة على استخدامها في العديد من المواقف. pS: السبب الذي ذكرته حتى أنني كنت في حاجة إلى تمرير كل من علامة الفاصلة العليا وعلامة تعجب لبرنامج بيرل وكنت بحاجة إلى الحل أدناه. :) - Jann
أنا أتفق مع كل من بنجامين وجان لكنه أعطى دفعة. يتم فهرسة عنوان السؤال بواسطة محركات البحث ، وهذه هي الطريقة التي جئت بها إلى هنا وربما يأتي معظم المستخدمين إلى هنا. لهذا السبب أعتقد أنه من المهم أن يعكس السؤال الفعلي المشكلة الكامنة وراءه. في المنتديات الأخرى ، يُنصح الناس (مجبرون تقريبًا) على السؤال عما يبحثون عنه بالضبط. الإجابة على الأسئلة التي يتم التعبير عنها بشكل سيئ تدعم السهو وهذا هو السبب الدقيق وراء تراجعي هنا. كحل وسط / حل ، اقتراحي هو المساعدة في تكييف العنوان بحيث يعكس المشكلة الفعلية. - ChristophK


السؤال القديم الذي أعرفه ، ولكن بالنسبة إلى الباحثين في المستقبل:

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

echo "It's broken"'!'

هذا يعمل حتى لو كان ! ليس في نهاية السطر.

على سبيل المثال:

echo "hello there"'!'" and goodbye"

مكافأة: يمكن استخدام تقنية مشابهة للهروب أي النص في Sh أو Bash (بمساعدة من sed): راجع الخيار الأول في هذا الجواب. علاوة على ذلك ، إذا كان لديك bash-completion المثبتة ، من المحتمل أن يكون لديك ال quote() وظيفة متاح بالفعل.


141
2018-06-23 19:16



نصيحة لطيفة ، JWD. لم أكن أدرك أن سلاسل bash يمكن أن تكون متسلسلة ببساطة عن طريق حذف المسافة البيضاء بينهما. - Alan H.
في الواقع ، إذا كانت علامة التعجب في نهاية السلسلة تكون واضحة echo "Happy birthday!" ستعمل كما هو متوقع وإلا يمكنك الهروب مع خط مائل عكسي ، ولكن سيتم طباعة الخط المائل العكسي وكذلك XD Bash ليس لضعاف القلب :) - h4unt3r
@ h4unt3r: غريب ، وهذا ليس تجربتي. لي، echo "Happy Birthday!" مخرجات 2 خطوط. الأول هو echo "Happy birthday" (لا تعجب) ، والثانية هي "عيد ميلاد سعيد" (مرة أخرى ، لا تعجب). هل تم تشغيل توسيع السجل عند إجراء هذا الاختبار؟ - jwd
jwd ما إصدار bash الذي تشغله؟ لدي دائما التوسع في التاريخ. هل استخدمت بطريق الخطأ اثنين !! للاختبار الخاص بك؟ - h4unt3r
@ h4unt3r: version 4.1.2(1)-release (x86_64-redhat-linux-gnu)، بالتأكيد واحد فقط ! تم استخدامها. لدي histexpand موجود في $SHELLOPTS. ومع ذلك ، لقد حاولت فقط 4.3.18 (2) -release على جهاز آخر ، ويتصرف كما وصفت لكم. أعتقد أنه كان علة ثابتة. - jwd


أطفأ توسيع التاريخ:

set +H

أو

set +o histexpand

63
2018-04-22 18:58



شكرا - هذا عمل ، ولكن كان علي القيام به set +o histexpand، ليس set -o histexpand. هل يمكنك تعديل إجابتك لإصلاح هذا؟ - Matthew
عفوًا ، خطأ مطبعي ، آسف. ثابت. - Dennis Williamson
ممتاز! كان يبحث عن هذا ل AGES .... THX VM! كما هربا متعود ... أنا لا أريد استخدام اقتباسات واحدة أيضا ... سأضيف هذا إلى بلدي .bashrc THX! ، لم تستخدم قط ! في النصوص ولا شيء! كان دائما مقلقا ... - Aquarius Power
هذا رائع جدا! echo "@AquariusPower!" - joehanna


استخدم علامات الاقتباس المفردة (') بدلاً من علامات الاقتباس المزدوجة ("). تنقلب علامات الاقتباس المفردة كل تفسير الأشياء الموجودة بها ، بينما لا يؤدي إيقاف علامات الاقتباس المزدوجة إلا إلى إيقاف تشغيل بعض.

bzr commit -m 'It works!'

9
2018-04-22 19:32





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

عرافة لعلامة تعجب ، كما هو موضح في http://www.ascii-code.com/، هو 21 ، لذلك إذا وضعت \x21 في نهاية السلسلة ، echo -e $foo، يصنع $foo صدى الموسعة الخاصة بها [أي ، foo=$(echo -e "$foo")] ، ما تحصل عليه عندما تكون echo $foo مرة أخرى هي سلسلة مع ! في نهايةالمطاف. ولا تبديل histexpand سواء.

يعمل بالتأكيد في Bash 4+. الإصدارات السابقة ، ymmv.


4
2017-11-23 04:28



همم لا يعمل بالنسبة لي. - lzap