Команда «цитата» в оболочке

15

Какая польза от команды quote? Я не нашел никакой информации об этом, ее нет среди исполняемых файлов в /binпапках, и ее нельзя найти среди встроенных программ Bash. Кажется, что он печатает только свой первый параметр, как echoкоманда и ничего более.

whtyger
источник
это просто добавляет цитаты
Хаким Вахаб
1
Просто покопавшись, я нашел утилиту под названием shell-quote, которая похожа на quote, но имеет некоторое применение с такими вещами, как ssh и для отладки скриптов bash. Думаю, я бы включил это здесь в качестве сноски. ' linux.die.net/man/1/shell-quote '
Джо
Похоже, у WTF есть такое общее слово, quoteиспользуемое для такой непонятной цели ... Нет префикса, чтобы пометить его как «внутренний», нет документации, ничего, если вы не копаетесь в деталях реализации продвинутой механики завершения дистрибутива. Я нахожу это немного тревожным.
Hyde
Это становится еще более неясным для человека, чей родной язык не английский. Как я, например. :)
whtyger

Ответы:

10

Что это?

Я заметил, что эта команда не работает в моей оболочке ( рыба, дружественная интерактивная оболочка ). Кажется, он работает только в bash (по умолчанию в Ubuntu).

chocobai@pc ~> /bin/bash 
chocobai@pc:~$ quote asdf
'asdf'chocobai@pc:~$ 

chocobai@pc:~$ type quote
quote is a function.
quote ()
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

Что оно делает? Для чего это можно использовать?

Это добавляет кавычки, но без новой строки. Он также экранирует одинарные кавычки способом, подходящим для bash. В сценариях может быть полезно заключить в кавычки переменную или какой-либо другой вид строки. Это необходимо, например, для путей / параметров с пробелами. Хотя есть и другие способы сделать это.

Это действительно странно, я не смог найти никакой документации (в сети) об этом. Но хорошо, легко увидеть, что он делает.

verpfeilt
источник
2
whichбесполезен, как в интерактивных оболочках, так и в скриптах. Используйте typeвместо этого. type quoteскажет вам, что это функция, и даже покажет определение функции. Беги help typeбольше на typeвстроенном.
гейра
Вы правы, спасибо. Я видел ответ выше, который также использовал тип, чтобы узнать, что это такое. Что ж, благодаря 'which' я знал, что это не исполняемый файл в / bin / или около того, потому что он не возвращает никакого пути. Я думаю, что это все еще было полезно. Но ты прав, я добавлю тип.
verpfeilt
2
В моем Ubuntu 12.04 эта функция действительно описана /etc/bash_completion, и она поставляется ~/.bashrcпо умолчанию, а не там, /etc/bash.bashrcгде /etc/bash_completionзакомментирован соответствующий раздел . Также /usr/share/bash-completion/в Ubuntu 12.04 отсутствует папка.
13
8

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

Я бы никогда не использовал эту функцию! Если вам нужно процитировать материал так, чтобы безопасно использовать снаряд, пожалуйста , используйте 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.

  • Находится quoteв /etc/bash.bashrc? да / нет и т.д ...
gniourf_gniourf
источник
quoteна самом деле экранирует одинарные кавычки, поэтому он может использоваться оболочкой. Это работает так же хорошо, как и printf %qдля этого варианта использования.
Flimm
@Flimm используйте на свой страх и риск!
gniourf_gniourf
@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
1
@Rockallite: Я только что попробовал, и это работает ожидаемый ...
gniourf_gniourf
Если вы хотите перейти непосредственно к источнику, вы можете использовать (shopt -s extdebug; declare -F quote), который сообщает вам имя функции, номер строки, в которой она определена, и имя файла, в котором она определена.
wjandrea
3

quote это функция:

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

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

Используйте следующую команду, чтобы проверить это:

type quote

Его цель очевидна.

Раду Рэдяну
источник
То, что он делает , понятно - но почему вы захотите это сделать, может и не быть. Во избежание сомнений: он будет использоваться для получения переменной, такой как $INPUT, которая может содержать пробелы, кавычки или другие символы, и возврата строки, которая определенно рассматривается bash как единственный аргумент.
Бен XO