Вопрос: В bash, как мне избежать восклицательного знака?


Я хочу сделать что-то вроде bzr commit -m "It works!", Я могу избежать восклицательного знака, сделав bzr commit -m "It works\!", Однако тогда мое сообщение commit включает обратную косую черту. Как избежать восклицательного знака, игнорируя обратную косую черту?


162
2018-04-22 18:53


Источник


дела bzr commit -m "It works"! тоже работает. - kba
Как я уже отмечал, команда, которую вы ставите, действительно работает над собой. bzr commit -m "It works!" - h4unt3r
Даже четный случай с вложенными цитатами: stackoverflow.com/questions/22125658/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Хотя принятый ответ является хорошим обходным решением для ваших проблем с фиксацией, я считаю, что это не ответ на реальную проблему: Расширение истории Bash, Пожалуйста, подумайте о принятии ответа Денниса? - Arjan


Ответы:


Поскольку вы не зависите от bash, чтобы развернуть переменные в сообщении фиксации, вы можете использовать одинарные кавычки. Строки в одинарных кавычках не расширяются bash.

bzr commit -m 'This does work!' 

133
2018-04-22 19:31



Поскольку вопрос: «Как избежать восклицательного знака?» а не «Как не развернуть восклицательный знак?» Я не думаю, что это действительно так. Есть несколько раз (например, при передаче апострофов и восклицательных знаков в той же командной строке), что это не работает. Ответ ниже работает намного лучше, чтобы сделать то, что нужно многим людям. - Jann
@Jann: Вы на самом деле на 100% прав, но я думаю, что проблема здесь в том, что у нас так много вопросов о суперпользователе: мы отвечаем на вопрос, или помогаем людям решить их конкретную проблему. Я думаю, что оба пути могут быть полезны, и это искало помощи по конкретной проблеме. - Benjamin Bannier
туш! Это была конкретная проблема. Я просто хочу получить ответ на мои вопросы, чтобы быть в состоянии использовать во многих ситуациях. pS: Причина, по которой я даже упоминал об этом, заключалась в том, что мне нужно было передать как апостроф, так и восклицательный знак в программу perl, и мне нужно было решение ниже. :) - Jann
Я соглашаюсь с Бенджамином и Джанном, но даю нисходящее движение. Название вопроса индексируется поисковыми системами, и вот как я пришел сюда, и, вероятно, большинство пользователей приходят сюда. Вот почему я считаю, что важно, чтобы фактический вопрос отражал проблему, стоящую за ней. В других форумах люди советуют (почти вынуждены) задавать именно то, что они ищут. Ответ на плохо выраженные вопросы поддерживает небрежность, и это точная причина моего понижения. В качестве компромисса / решения мое предложение заключается в том, чтобы помочь адаптировать заголовок, чтобы он отражал актуальную проблему. - ChristophK


Старый вопрос, который я знаю, но для будущих искателей:

Вы также можете использовать этот метод, если вам нужны двойные кавычки, а также восклицание:

echo "It's broken"'!'

Это работает, даже если ! не находится в конце строки.

Например:

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

Бонус: подобный метод можно использовать для Любые текст в Sh или Bash (с помощью sed): см. первый вариант в этот ответ, Кроме того, если у вас есть bash-completion установленных, вероятно, quote() функция уже имеется.


139
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) -изменить на другой машине, и он ведет себя так, как вы описали. Я думаю, это была ошибка, которая была исправлена. - jwd


Выключить расширение истории:

set +H

или

set +o histexpand

63
2018-04-22 18:58



Спасибо - это сработало, но я должен был сделать set +o histexpand, а не set -o histexpand, Не могли бы вы отредактировать свой ответ, чтобы исправить это? - Matthew Pirocchi
Ой, опечатка, извините. Исправлена. - Dennis Williamson
свободно! искал это для AGES .... thx vm! как побег не будет работать ... Я также не хочу использовать одинарные кавычки ... Я добавлю это к своему .bashrc thx !!, никогда не использовался ! в скриптах и ​​для ничего !! это всегда беспокоило ... - Aquarius Power
Это так здорово! echo "@AquariusPower!" - joehanna


Используйте одиночные кавычки (') вместо двойных кавычек («). Одиночные кавычки отключают всю интерпретацию материала в них, а двойные кавычки только отключают некоторые.

bzr commit -m 'It works!'

9
2018-04-22 19:32





Я только что нашел другой способ, который, по крайней мере, будет работать с echo(предложения), вы хотите, чтобы акцентировать восклицательный знак. Он работает в конечном итоге, более или менее, вокруг Bash 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