bash shell arguments escaping echo

bash - echo que shell escapa argumentos



arguments escaping (1)

Esta pregunta ya tiene una respuesta aquí:

¿Existe un comando que no solo elimine su argumento sino que también los escape si es necesario (por ejemplo, si un argumento contiene espacios en blanco o un carácter especial)?

Lo necesitaría en alguna magia de shell donde, en lugar de ejecutar un comando en un script, repito el comando. Esta salida se canaliza a un script de 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 por el cual los datos calculados se almacenan en caché entre corre de main ()).

Por supuesto, en lugar de eso, podría trasladar toda la magia de shell a Python, donde no necesitaría canalizar nada.


Con bash, el componente printf builtin tiene un especificador de formato adicional %q , que imprime el argumento correspondiente de una forma sencilla:

Además de los formatos estándar de printf (1), %b hace que printf expanda las secuencias de escape de barra invertida en el argumento correspondiente (excepto que /c termina la salida, las barras diagonales inversas en /' , /" y /? No se eliminan, y los escapes octales comenzando con /0 puede contener hasta cuatro dígitos), y %q hace que printf genere el argumento correspondiente en un formato que se puede reutilizar como entrada de shell.

Así que puedes 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 sea seguro pasar como entrada nuevamente (es decir, espacios escapados). Por ejemplo:

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

(Agregué una nueva línea solo para que sea bonita en un shell interactivo).