Acaba de suceder algo increíblemente extraño. Por un grave error tipográfico, ingresé
cp filename.xsl .^?~
Sí, así es, punto-caret-signo de interrogación-tilde. La verdad es más extraña que la ficción.
Se vuelve más extraño. cuando escribo
cat .
y luego presiono TAB, obtengo
./ ../ .^?~
pero cuando hago un ls -a
, obtengo
. .. .?~
Finalmente, cuando lo hago
rm .?~
el comando de eliminación me solicita lo siguiente:
rm: remove write-protected regular file `.\177~'?
antes de eliminarlo con éxito. ¿Por qué la discrepancia de la existencia del signo de intercalación?
Respuesta1
Esto se debe a que el signo de intercalación se usa a menudo para indicar ctrlque se presionó la tecla o que, de otro modo, es un carácter de control.
La secuencia de teclas que realmente escribiste fue esta:
cp filename.xsl .
ctrl+Vbackspace~Enter
Probablemente estaba intentando copiar el archivo a su directorio de inicio ( ~
). Puedes repetir esto escribiendo ctrl+ Vbackspace. Lo verás ^?
impreso en la pantalla.
Puede ver archivos con caracteres que no se pueden imprimir convertidos aestilo Cse escapa así (lo importante es la bandera, pero dado que su archivo comienza con un punto , también -b
necesitará :-a
$ ls -ab
. .. .\177~
Sin el -b
solo lo ve .?~
no porque simplemente se omita ^
, sino porque cualquier carácter no imprimible se muestra como ?
. Pruebe touch
ctrl+ VEnterfooEntery luego ls
. El archivo que verá será ?foo
. Entonces ls -b
lo demostrará \rfoo
.
Entonces, cuando rm .?~
coincide, porque en este caso el ?
shell interpreta lo que escribió como un comodín global para coincidir con cualquier carácter individual, no específicamente un signo de interrogación real. Tiene rm
un alias, rm -i
por lo que confirma su acción y, cuando lo hace, muestra el código de escape estilo C.
Respuesta2
El carácter extraño que tienes en ese nombre de archivo (como lo indica rm
) es el carácter 0177
( 0x7F
h / 127
d ). Ese es el Del
personaje.
El autocompletado de Bash parece no poder manejarlo de manera consistente.
ls
imprime un ?
para caracteres no imprimibles (por defecto). Intentar:
$ echo a > .$'\x7f'~
$ ls -b .??
.\177~
rm
está siendo útil e imprime su valor octal.
Respuesta3
Cuando presionas TAB y el shell adivina algún tipo de nombre de archivo, imprime dos caracteres, '^' y '?' para el byte valorado en octal 177. ¿Puede obtener un nombre de archivo con un byte de ese valor presionando Ctrl-V y luego Shift-Ctrl-? (tres llaves a la vez) para probar.
El nombre del archivo no era punto-caret-questionmark-tilde, sino punto-octal 177-tilde. Diferentes programas optaron por representar el byte con valor octal-177 de diferentes maneras.