/ / Cómo usar comillas en los argumentos de comando en Rust - rust

Cómo usar las comillas en los argumentos de comando en Rust - rust

Me estoy volviendo loco. Quiero generar este comando en herrumbre git log --grep="foo". Esto funciona bien desde la línea de comandos.

Así que sigo adelante y lo intento así.

Command::new("git")
.arg("log")
.arg("--grep="foo"")
.spawn()

Eso no funciona.

Puedo hacerlo funcionar si lo cambio a esto:

Command::new("git")
.arg("log")
.arg("--grep=foo")
.spawn()

Pero esto solo funciona porque las comillas se pueden omitir en este caso simple para que se ejecute git log --grep=foo que no es lo que quiero. Probé muchas versiones diferentes usando format! Estoy sacándome el pelo.

Traté de rastrearlo con dtruss para averiguar qué utiliza realmente Rust, pero tampoco he tenido suerte con eso.

ACTUALIZAR

Ok, resolví el problema. Fue un poco complicado (al menos para mí).

El comando que quería ejecutar era git log --grep="foo|bar" -E. Esto debe tener comillas cuando se realiza en la línea de comando. Pero también es importante tener en cuenta que debe combinarse con el -E parámetro.

En Rust sin embargo necesito quitar las comillas.

Command::new("git")
.arg("log")
.arg("-E")
.arg("--grep=foo|bar")
.spawn()

Todavía me gustaría saber por qué tengo que omitir las citas en Rust.

Respuestas

2 para la respuesta № 1

Todavía me gustaría saber por qué tengo que omitir las citas en Rust.

Porque no tienes shell para interpretarlos.

Cuando inicia el comando desde shell, los necesita, porque git log --grep=foo|bar -E sería interpretado como tubería git log --grep=foo a bar -E.

Sin embargo, después de que el shell ha interpretado los comandos, los argumentos git recibe son efectivamente log, --grep=foo|bary -E.

Al invocar el comando desde Rust, no hay una interpretación del comando por parte de un shell, por lo que no necesita las comillas. Poner la cita sería lo mismo que ejecutar este comando desde el shell

git log --grep=""foo|bar"" -E