2009-12-01 20 views
16

Para el comando:/usr/bin/sh -c "ls 1`" (una comilla atrás después de 1).Escape de comillas atrás en una cadena de comillas dobles en shell

¿Cómo hacer que funcione correctamente? Agregar una barra invertida antes de "` "no funciona. `es un char especial como lo conocemos, y traté de rodearlo con comillas simples también (/ usr/bin/sh -c" ls 1'` '"), pero eso tampoco funciona.

El error siempre son:

% /usr/bin/sh -c "ls 1\`" 
Unmatched ` 
+0

¿Tiene un solo retroceso? Es '1 \' 'un nombre de archivo? –

+0

Sí, en realidad puedo crear un archivo llamado "1'" emitiendo el comando "touch 1'", pero el shell simplemente no puede analizarlo dentro de comillas dobles –

Respuesta

1

Use comillas simples en su lugar:

/usr/bin/sh -c 'ls 1\`' 
33

tiene que escapar del acento grave, sino también escapar de la barra invertida:

 
$ touch 1\` 
$ /bin/sh -c "ls 1\\\`" 
1` 

La razón tienes que escapar "dos veces" porque estás ingresando este comando en un entorno (como un script de shell) tha t interpreta la secuencia de comillas dobles una vez. Luego es interpretado nuevamente por la subshell.

También podría evitar las comillas dobles, y evitar así la primera interpretación:

 
$ /bin/sh -c 'ls 1\`' 
1` 

Otra forma es la de almacenar el nombre del archivo en una variable, y utilizar este valor:

 
$ export F='1`' 
$ printenv F 
1` 
$ /bin/sh -c 'ls $F' # note that /bin/sh interprets $F, not my current shell 
1` 

Y, por último, lo que ha intentado funcionará en algunos proyectiles (estoy usando bash, como en los ejemplos anteriores), aparentemente no con su shell:

 
$ /bin/sh -c "ls 1'\`'" 
1` 
$ csh # enter csh, the next line is executed in that environment 
% /bin/sh -c "ls 1'\`'" 
Unmatched `. 

Le sugiero que evite dichos nombres de archivos en el first place.

Cuestiones relacionadas