El autocompletado de Bash da un nombre de archivo diferente al de ls

El autocompletado de Bash da un nombre de archivo diferente al de ls

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 -bnecesitará :-a

$ ls -ab
.  ..  .\177~

Sin el -bsolo lo ve .?~no porque simplemente se omita ^, sino porque cualquier carácter no imprimible se muestra como ?. Pruebe touchctrl+ VEnterfooEntery luego ls. El archivo que verá será ?foo. Entonces ls -blo 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 rmun alias, rm -ipor 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( 0x7Fh / 127d ). Ese es el Delpersonaje.

El autocompletado de Bash parece no poder manejarlo de manera consistente. lsimprime un ?para caracteres no imprimibles (por defecto). Intentar:

$ echo a > .$'\x7f'~
$ ls -b .??
.\177~

rmestá 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.

información relacionada