Comando "quote" no shell

15

Qual é o uso do comando quote? Não encontrei nenhuma informação sobre ele, ele não está entre os arquivos executáveis ​​nas /binpastas e não pode ser encontrado entre os built-ins do Bash. Parece que apenas imprime seu primeiro parâmetro, como um echocomando e nada mais.

whtyger
fonte
ele apenas adiciona as aspas
Hakeem Wahab
11
Apenas bisbilhotando, encontrei um utilitário chamado shell-quote que é semelhante ao quote, mas tem alguns usos com coisas como ssh e para depuração de scripts bash. Pensei em incluí-lo aqui como uma nota de rodapé. ' linux.die.net/man/1/shell-quote '
Joe
Parece que um WTF tem uma palavra tão comum quote, usada para fins tão obscuros ... Nenhum prefixo para marcá-lo "interno", nenhuma documentação, nada, a menos que você procure detalhes de implementação da mecânica de conclusão avançada da distribuição. Acho isso um pouco perturbador.
Hyde 26/11
Torna-se ainda mais obscuro para a pessoa, cuja língua nativa não é o inglês. Como eu, por exemplo. :)
whtyger 27/11/14

Respostas:

10

O que é isso?

Notei que este comando não funciona no meu shell ( peixe, shell interativo amigável ). Parece que só funciona no bash (padrão do 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"
}

O que isso faz? Para que isso pode ser usado?

Ele adiciona as aspas, mas nenhuma nova linha. Ele também escapa aspas simples de uma maneira adequada para o bash. Pode ser útil nos scripts citar uma variável ou algum outro tipo de string. Você precisa disso, por exemplo, para caminhos / parâmetros com espaços. Embora existam outras maneiras de fazer isso.

É realmente estranho que eu não tenha encontrado nenhuma documentação (na Web) sobre isso. Mas bem, é fácil ver o que faz.

verpfeilt
fonte
2
whiché inútil, tanto em shells interativos quanto em scripts. Use em typevez disso. type quotedirá que é uma função e até mostra a definição da função. Corra help typepara typesaber mais sobre o builtin.
Geirha # 7/13
Você está certo, obrigado. Vi a resposta acima, que também utilizava o tipo para descobrir o que é. Bem, graças a 'what' eu sabia que não era um executável em / bin /, porque não retornou nenhum caminho. Eu acho que ainda foi útil. Mas você está certo, vou adicionar tipo.
precisa
2
No meu Ubuntu 12.04, essa função é realmente descrita em /etc/bash_completion, que é fornecida ~/.bashrcpor padrão, não por /etc/bash.bashrconde a seção referente /etc/bash_completioné comentada. Também a /usr/share/bash-completion/pasta está ausente no Ubuntu 12.04.
whtyger
8

quoteé uma função definida (aqui no meu sistema Debian, mas acho que é a mesma coisa no Ubuntu) no arquivo /usr/share/bash-completion/bash_completion, que é originário /etc/bash.bashrcda inicialização do Bash.

Eu nunca usaria essa função! Se você precisar citar itens para poder ser usado com segurança por um shell, use printfcom o %qmodificador, como:

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

De fato, mesmo que isso raramente seja usado, sempre existem estratégias melhores para coisas de alto nível, como nós, usuários, normalmente fazemos. Essa quotecoisa é usada internamente por algumas coisas obscuras que nem queremos saber. Esta quotefunção é provavelmente específica do fornecedor / distribuição (leia específica do Debian) e provavelmente não é portátil, e pode até mudar em versões futuras.

Editar. Acabei de verificar um sistema Ubuntu 12.04, e a quotefunção é definida em /etc/bash_completion, originada por /etc/bash.bashrc, ela própria originada por /etc/profile.

Como eu determinei isso? usando um pouco de heurística:

  • Verifique se quoteaparece em /etc/profile:

    grep '\bquote\b' /etc/profile

    Não. Vá para o próximo passo.

  • Quais são os arquivos obtidos /etc/profile?

    grep '[[:space:]]\.[[:space:]]' /etc/profile

    Eu tenho $i(necessidade de olhar para a fonte para o que este fontes, mas neste caso é os arquivos /etc/profile.d/*.shse algum (e se legível) e /etc/bash.bashrc. Olhando nos /etc/bash.bashrc.

  • Está quotedentro /etc/bash.bashrc? sim / não, etc ...
gniourf_gniourf
fonte
quote, na verdade, escapa aspas simples, por isso é utilizável pelo shell. Funciona tão bem quanto printf %qneste caso de uso.
Flimm
A @Flimm usa por sua conta e risco!
precisa saber é o seguinte
@gniourf_gniourf Acho que printf% q não lida corretamente com til ( ~ ). Tente isto: my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")". Você veria algo como Expected: ~/.bashrc, quote: ~/.bashrce printf %q: /home/your_username/.bashrc.
Rockallite 26/02
11
@Rockallite: Eu apenas tentei e ele funciona um esperado ...
gniourf_gniourf
Se você quiser pular direto à fonte, você pode usar (shopt -s extdebug; declare -F quote), que lhe diz o nome da função, número da linha é definido em, eo nome do arquivo é definido no.
wjandrea
3

quote é uma função:

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

Essa função é definida em algum lugar do arquivo de inicialização do bash. Mais precisamente, se você estiver usando o Ubuntu 13.04, poderá encontrá-lo na /usr/share/bash-completion/bash_completionlinha 142.

Use o seguinte comando para verificá-lo:

type quote

Seu objetivo é evidentemente claro.

Radu Rădeanu
fonte
O que ele faz é claro - mas por que você gostaria de fazer isso pode não ser. Para evitar dúvidas: seria usado para pegar uma variável como $INPUT, que pode conter espaços, aspas ou outros caracteres, e retornar uma string que definitivamente é tratada apenas como um único argumento pelo bash.
Ben XO