significado de "'" (apóstrofe) en los comandos de terminal

11

Por alguna extraña razón, intenté "'" como separador de palabras en los identificadores, como en:

$ export foo'bar=1
> 
> ^C
$ 

El resultado es como se muestra arriba, id est el aviso cambia a ">" y el sistema obviamente espera más información de mi parte. Como ves, tuve que presionar Ctrl-C para escapar. Lo mismo ocurre con otros comandos como

$ ls foo'bar
$ mkdir foo'bar

Tengo curiosidad sobre el sentido de todo esto, eso es lo que tiene un significado especial "'" en los comandos de terminal (de hecho, es tan especial que se desarma incluso dentro de los identificadores).

Extra: Como comentario aparte, también me gustaría conocer el conjunto de caracteres especiales o no válidos en los nombres de archivos y carpetas, tanto en sistemas Unix como Windows (para obtener el subconjunto común de los seguros) (en particular, ¿qué pasa con todos no ASCII?)

Gracias Denis

denis 63
fuente
En el mundo Linux, todos los caracteres excepto \ 0 (nulo) y / están permitidos. Sin embargo, eso no significa que todos sean recomendables. Muchas personas consideran que es mejor evitar los personajes que tienen un significado especial para el shell. Si desea saber acerca de Windows, consulte una referencia de Windows.
Scott Severance

Respuestas:

15

El 'carácter es un personaje muy poderoso cuando se usa en cualquier comando de shell. Básicamente, el '(marcas de apóstrofe) desactiva todo tipo de transformaciones o modificaciones. Consideraría todo lo que se incluye con las 'marcas como una sola entidad, es decir, un solo parámetro. Absolutamente no tendría lugar ningún tipo de sustitución o expansión.

Ejemplo:

 $ echo '$HOME'

produciría en la salida la $HOMEpropia cadena y no imprimiría la ruta a su directorio de inicio. Dado que las comillas simples evitan cualquier tipo de expansión, la sustitución y simple considera lo que esté presente como un parámetro simple en sí mismo.

Si desea utilizar el apóstrofe tal como es, debe escapar:

 $ mkdir foo\'bar

 $ cd foo\'bar

Si no se escapa, esperará a que se cierre su par, como sucedió en su primer ejemplo.

Entonces, corregido, su comando será:

 $ export foo\'bar=1

NOTA: Como lo notó Milan Todorovic, esto no será válido, porque no puede usar apóstrofe en este caso.

Frantique
fuente
1
@ denis63 acepta la respuesta si es lo que necesitabas ver :)
Rinzwind
7

El personaje 'es un personaje especial. Lo usa para marcar parte de la entrada de la línea de comandos que no se cambiará (por ejemplo, sin reemplazo de comodines). Por ejemplo:

$ ls 'bla*'
ls: cannot access bla*: No such file or directory

Esto significa que el argumento para lswas bla*y no todo lo que comienza con bla.

La razón por la que obtienes un >personaje es porque debes usar uno 'para abrir y otro 'para cerrar parte que no se cambiará.

Si desea utilizar 'en los nombres de carpeta que debe escapar de esta manera: \'. Entonces, si desea enumerar la carpeta con nombre foo'bar, debe escribir ls foo\'bar.

Ah, y no estoy seguro de si es posible usar 'en nombres de variables de entorno. Creo que no puedes usar export foo\'bar=1,

Espero que esto ayude.

Milan Todorovic
fuente
Vota a favor de tu observación sobre la restricción de nombre de variable de entorno
Frantique
Todavía no puedo votar (nuevo en askubuntu), pero la sensación está ahí. Comprobado sobre los nombres de env var, es justo como usted dice. (Me siento un poco estúpido por no haber pensado en abrir / cerrar delimitadores yo mismo, pero luego consideré "'" como un verdadero apóstrofe, no entre comillas simples). Denis
denis 63