2010-04-28 16 views
15

¿Hay un comando que no solo eche su argumento sino que también lo escape si es necesario (por ejemplo, si un argumento contiene un espacio en blanco o un carácter especial)?echo that shell-escapes arguments

Lo necesitaría en alguna magia de concha donde en lugar de ejecutar un comando en una secuencia de comandos hago eco del comando. Esta salida se canaliza a una secuencia de comandos python que finalmente ejecuta los comandos de una manera más eficiente (carga el método main() del script de python de destino real y lo ejecuta con los argumentos dados y un parámetro adicional mediante datos calculados por la bruja se almacena en caché entre carreras de main()).

En lugar de eso, podría, por supuesto, portar toda la magia de la concha a Python, donde no necesitaría canalizar nada.

Respuesta

23

Con bash, el printf orden interna tiene un formato especificador adicional %q, que imprime el argumento correspondiente de una manera amigable:

Además de la función printf (1) Por formatos, %b causas printf para expandir la barra invertida secuencias de escape en el argumento correspondiente (excepto que \c termina de salida, barras invertidas en \', \", y \? no se quitan, y octal escapa comenzando con \0 puede contener hasta cuatro dígitos), y %q causas printf a la salida de los argumen correspondientes t en un formato que se puede reutilizar como entrada de shell.

Así que usted puede hacer algo como esto:

printf %q "$VARIABLE" 
printf %q "$(my_command)" 

para obtener el contenido de una variable o la salida de un comando en un formato que es seguro pasar en como entrada una vez más (espacios es decir escaparon). Por ejemplo:

$ printf "%q\n" "foo bar" 
foo\ bar 

(que añade una nueva línea justo por lo que será bonito en un shell interactivo.)

+1

Gracias, yo no sabía nada de eso. Si usa zsh, también puede usar el modificador 'q':' $ {(q) VAR} 'escapa de la variable de forma similar. – ZyX

+0

Gracias, pero al usar printf tendría que saber la cantidad de argumentos por adelantado. Bueno, supongo que descubro algo. – panzi

+2

Er, ¿hay alguna razón por la que no puedas hacer algo como 'for arg in" $ @ "; hacer printf% q "$ arg"; hecho'? – Cascabel