Comando "cita" en el shell


15

¿Cuál es el uso del comando quote? No he encontrado ninguna información al respecto, no se encuentra entre los archivos ejecutables en las /bincarpetas, y no se puede encontrar entre las funciones integradas de Bash. Parece que solo imprime su primer parámetro, como un echocomando y nada más.


solo agrega las citas
Hakeem Wahab

1
Solo hurgando, encontré una utilidad llamada shell-quote que es similar a quote, pero tiene algunos usos con cosas como ssh y para depurar scripts de bash. Pensé que lo incluiría aquí como una nota al pie. ' linux.die.net/man/1/shell-quote '
Joe

Se siente como un WTF para tener una palabra tan común quote, utilizada para un propósito tan oscuro ... Sin prefijo para marcarlo "interno", sin documentación, nada, a menos que vaya a cavar en detalles de implementación de la mecánica de finalización avanzada de la distribución. Esto me parece un poco inquietante.
hyde

Se vuelve aún más oscuro para la persona, cuyo idioma nativo no es el inglés. Como yo, por ejemplo. :)
whtyger

Respuestas:


10

¿Qué es?

Noté que este comando no funciona en mi shell ( fish, shell interactivo amigable ). Parece que solo funciona en bash (el valor predeterminado de 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"
}

¿Qué hace? Para qué se puede usar?

Agrega las comillas pero no la nueva línea. También escapa a las comillas simples de una manera adecuada para bash. Puede ser útil en las secuencias de comandos para citar una variable o algún otro tipo de cadena. Necesita esto, por ejemplo, para rutas / parámetros con espacios. Aunque hay otras formas de hacer esto.

Es realmente extraño que no pude encontrar ninguna documentación (en la web) al respecto. Pero bueno, es fácil ver lo que hace.


2
whiches inútil, tanto en shells interactivos como en scripts. Usar en su typelugar. type quotele dirá que es una función e incluso muestra la definición de la función. Corre help typepor más en el typeedificio.
geirha

Tienes razon, gracias. Vi la respuesta anterior que también usaba el tipo para descubrir de qué se trataba. Bueno, gracias a 'which' supe que no era un ejecutable en / bin / o así, porque no devolvió ninguna ruta. Creo que todavía fue algo útil. Pero tienes razón, agregaré tipo.
verpfeilt

2
En mi Ubuntu 12.04, esta función se describe realmente /etc/bash_completion, que se obtiene ~/.bashrcde forma predeterminada, no por /etc/bash.bashrcdonde /etc/bash_completionse comenta la sección correspondiente. También la /usr/share/bash-completion/carpeta está ausente en Ubuntu 12.04.
whtyger

8

quotees una función que está definida (aquí en mi sistema Debian, pero supongo que es lo mismo en Ubuntu) en el archivo /usr/share/bash-completion/bash_completion, que en sí mismo se origina /etc/bash.bashrcen el inicio de Bash.

¡Nunca usaría esta función! Si necesita citar cosas para que un shell pueda usarlas printfcon seguridad, úselas con el %qmodificador, como:

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

De hecho, incluso esto se usa muy raramente, siempre hay mejores estrategias para cosas de alto nivel como nosotros, los usuarios, usualmente lo hacemos. Esta quotecosa es utilizada internamente por algunas cosas oscuras que ni siquiera queremos saber. Esta quotefunción es probablemente específica del proveedor / distribución (leer específica de Debian) y probablemente no sea portátil en absoluto, e incluso podría cambiar en futuras versiones.

Editar. Acabo de comprobar en un sistema Ubuntu 12.04, y la quotefunción se define en /etc/bash_completion, originada por /etc/bash.bashrc, propiamente dicha /etc/profile.

¿Cómo determiné esto? usando un poco de heurística:

  • Verificar si quoteaparece en /etc/profile:

    grep '\bquote\b' /etc/profile

    No. Ve al siguiente paso.

  • ¿De qué proceden los archivos /etc/profile?

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

    Tengo $i(necesito buscar en la fuente cuáles son estas fuentes, pero en este caso son los archivos /etc/profile.d/*.shsi los hay (y si son legibles) y /etc/bash.bashrc. Buscando /etc/bash.bashrc.

  • Está quoteadentro /etc/bash.bashrc? si / no, etc ...

quoteen realidad escapa a las comillas simples, por lo que puede ser utilizado por el shell. Funciona tan bien como printf %qpara este caso de uso.
Flimm

¡Uso de @Flimm bajo su propio riesgo!
gniourf_gniourf

@gniourf_gniourf Creo que printf% q no maneja adecuadamente tilde ( ~ ). Prueba esto: my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")". Verías algo como Expected: ~/.bashrc, quote: ~/.bashrcy printf %q: /home/your_username/.bashrc.
Rockallite

1
@Rockallite: Acabo de probarlo y funciona como se esperaba ...
gniourf_gniourf

Si desea saltar directamente a la fuente, puede usarlo (shopt -s extdebug; declare -F quote), que le indica el nombre de la función, el número de línea en el que está definido y el nombre de archivo en el que está definido.
wjandrea

3

quote es una función:

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

Esta función se define en algún lugar de un archivo de inicialización bash. Más precisamente, si está usando Ubuntu 13.04, puede encontrarlo en /usr/share/bash-completion/bash_completionla línea 142.

Use el siguiente comando para verificarlo:

type quote

Su propósito es evidentemente claro.


Lo que hace está claro, pero es posible que no sea por qué querrías hacerlo. Para evitar dudas: se usaría para tomar una variable como $INPUT, que puede contener espacios, comillas u otros caracteres, y devolver una cadena que definitivamente solo bash trata como un argumento único.
Ben XO
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.