Команда "цитувати" в оболонці


15

Яке використання команди quote? Я не знайшов жодної інформації про нього, він не є серед виконуваних файлів у /binпапках, і його неможливо знайти серед вбудованих файлів Bash. Здається, що він друкує лише перший параметр, як echoкоманда, і більше нічого.


він просто додає цитати
Хакем Вахаб

1
Щойно роздумуючи, я знайшов утиліту під назвою shell-quota, яка схожа на цитату, але має деякі можливості з такими речами, як ssh та для налагодження bash-скриптів. Думав, я включу його сюди як виноску. ' linux.die.net/man/1/shell-quote '
Джо

Відчуває, що WTF має таке загальне слово, яке quoteвикористовується для такої незрозумілої мети ... Немає префікса, щоб позначити його "внутрішнім", жодної документації, нічого, якщо ви не перекопаєте деталі впровадження передової механіки завершення дистрибутива. Я вважаю це трохи тривожним.
Гайд

Це стає ще більш незрозумілим для людини, рідною мовою якої не є англійська. Як я, наприклад. :)
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"
}

Що це робить? Для чого його можна використовувати?

Він додає лапки, але немає нового рядка. Він також уникає одинарних лапок таким чином, що підходить для баш. Сценарії можуть бути корисними для цитування змінної чи якогось іншого рядка. Це вам потрібно, наприклад, для шляхів / параметрів з пробілами. Хоча є й інші способи зробити це.

Це дійсно дивно, що я не міг знайти жодної документації (в Інтернеті) про це. Але добре, легко зрозуміти, що це робить.


2
whichмарно, як в інтерактивних оболонках, так і в сценаріях. Використовуйте typeзамість цього. type quoteскаже вам, що це функція, і навіть покаже визначення функції. Бігаймо help typeбільше про typeвбудований.
geirha

Ви маєте рацію, дякую. Я побачив відповідь, яка також використовувала тип, щоб дізнатися, що це таке. Ну, завдяки "котрий" я знав, що це не виконуваний файл у / bin / або тому, тому що він не повертає жодного шляху. Я думаю, це все-таки було корисно. Але ти маєш рацію, я додам тип.
verpfeilt

2
У моєму Ubuntu 12.04 ця функція справді описана в /etc/bash_completion, яка використовується ~/.bashrcза замовчуванням, а не /etc/bash.bashrcтам, де /etc/bash_completionкоментується розділ щодо . Також /usr/share/bash-completion/папка відсутня в Ubuntu 12.04.
whtyger

8

quoteце функція, яка визначена (тут у моїй системі Debian, але, мабуть, це те саме на Ubuntu) у файлі /usr/share/bash-completion/bash_completion, який сам отримує /etc/bash.bashrcпри запуску Баша.

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

quoteнасправді уникає одинарних лапок, тому вона може бути використана оболонкою. Він працює так само добре, як і printf %qдля цього випадку використання.
Flimm

@Flimm використовуйте на свій страх і ризик!
gniourf_gniourf

@gniourf_gniourf Я думаю, що printf% q неправильно обробляє tilde ( ~ ). Спробуйте це: 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.