& Ldquo; цитата & Rdquo; команда в оболочке

В XFCE можно установить приложения Gnome Panel. Если приложение native panel недоступно в XFCE, вы можете рассмотреть возможность добавления приложения панели Gnome, которое выполняет ту же работу.

1
задан 7 October 2013 в 20:59

2 ответа

quote - это функция, которая определена (здесь, на моей системе Debian, но я думаю, что это то же самое на Ubuntu) в файле /usr/share/bash-completion/bash_completion, который сам по себе используется /etc/bash.bashrc при запуске Bash. [!d0 ]

Я бы никогда не использовал эту функцию! Если вам нужно процитировать материал, чтобы его можно было безопасно использовать оболочкой, используйте printf с модификатором %q, как:

printf '%q\n' "Hello my friend I like 'single quotes' as well as \"double quotes\""

На самом деле, даже это очень редко используется, всегда есть лучшие стратегии для материалов высокого уровня, как мы, пользователи, обычно делаем. Эта вещь quote используется внутренне некоторыми неясными вещами, о которых мы даже не хотим знать. Эта функция quote, вероятно, относится к конкретным поставщикам / дистрибутивам (читайте специфичные для Debian) и, вероятно, вообще не переносима и может даже измениться в будущих выпусках.

Изменить. Я только что проверил систему Ubuntu 12.04, а функция quote определена в /etc/bash_completion, полученная /etc/bash.bashrc, сама получена /etc/profile.

Как я это определял? используя немного эвристики:

Проверьте, появляется ли quote в /etc/profile:
grep '\bquote\b' /etc/profile
Нет. Перейдите к следующему шагу. Каковы файлы, полученные с помощью /etc/profile?
grep '[[:space:]]\.[[:space:]]' /etc/profile
У меня есть $i (нужно заглянуть в источник для этих источников, но в этом случае это файлы /etc/profile.d/*.sh, если они есть (и если они читаются) и /etc/bash.bashrc. Глядя в /etc/bash.bashrc. [ f22] в /etc/bash.bashrc? да / нет и т. д. ...
8
ответ дан 24 May 2018 в 17:10
  • 1
    quote действительно избегает одиночных кавычек, поэтому его можно использовать оболочкой. Он работает так же хорошо, как printf %q для этого случая использования. – Flimm 9 October 2013 в 13:48
  • 2
    @Flimm использовать на свой страх и риск! – gniourf_gniourf 9 October 2013 в 19:26
  • 3
    @gniourf_gniourf Я думаю, что printf% q неправильно обрабатывает тильду ( ~ ). Попробуйте следующее: my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")". Вы увидите что-то вроде Expected: ~/.bashrc, quote: ~/.bashrc и printf %q: /home/your_username/.bashrc. – Rockallite 26 February 2017 в 08:46
  • 4
    @Rockallite: Я просто попробовал, и он работает ожидаемо ... – gniourf_gniourf 26 February 2017 в 12:15
  • 5
    Если вы хотите перейти прямо к источнику, вы можете использовать (shopt -s extdebug; declare -F quote), в котором указывается имя функции, номер строки, в которой она определена, и имя файла, в котором она определена. – wjandrea 12 January 2018 в 06:58

quote является функцией:

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

Эта функция определена где-то в файле инициализации bash. Точнее, если вы используете Ubuntu 13.04, вы можете найти его в /usr/share/bash-completion/bash_completion в строке 142.

Используйте следующую команду для проверки:

type quote

Цель очевидно, ясно.

3
ответ дан 24 May 2018 в 17:10
  • 1
    То, что он делает понятным, но почему вы хотели бы этого сделать, может и не быть. Во избежание сомнений: он будет использоваться для принятия переменной, такой как $INPUT, которая может содержать пробелы, кавычки или другие символы, и возвращает строку, которая определенно рассматривается только как один аргумент bash. – Ben XO 12 September 2016 в 13:00

Другие вопросы по тегам:

Похожие вопросы: