Gerade ist etwas unglaublich Seltsames passiert. Durch einen schweren Tippfehler habe ich eingegeben
cp filename.xsl .^?~
Ja, das stimmt, Punkt-Caret-Fragezeichen-Tilde! Die Wahrheit ist seltsamer als die Fiktion.
Es wird noch seltsamer. Wenn ich tippe
cat .
und dann drücke TABich
./ ../ .^?~
aber wenn ich ein mache ls -a
, bekomme ich
. .. .?~
Schließlich, wenn ich
rm .?~
Der Befehl „Remove“ fordert mich folgendermaßen auf:
rm: remove write-protected regular file `.\177~'?
bevor es erfolgreich entfernt wurde. Warum besteht keine Übereinstimmung hinsichtlich der Existenz des Cursors?
Antwort1
Dies liegt daran, dass das Caret-Zeichen häufig verwendet wird, um anzuzeigen, dass eine ctrlTaste gedrückt wurde, oder dass es sich anderweitig um ein Steuerzeichen handelt.
Die Tastenfolge, die Sie tatsächlich eingegeben haben, war diese:
cp filename.xsl .
ctrl+Vbackspace~Enter
Sie haben vermutlich versucht, die Datei in Ihr Home-Verzeichnis ( ) zu kopieren ~
. Sie können dies wiederholen, indem Sie ctrl+ eingeben. Auf dem Bildschirm Vbackspacewird angezeigt .^?
Sie können Dateien mit nicht druckbaren Zeichen anzeigen, die inC-StilEscapezeichen wie folgt (das -b
Flag ist wichtig, aber da Ihre Datei mit einem Punkt beginnt, benötigen Sie -a
auch Folgendes):
$ ls -ab
. .. .\177~
Ohne das -b
wird es nur als angezeigt, .?~
nicht weil das einfach weggelassen wird ^
, sondern weil alle nicht druckbaren Zeichen als angezeigt werden ?
. Versuchen Sie es mit touch
ctrl+ VEnterfooEnterund dann mit ls
. Die angezeigte Datei ist ?foo
. Dann ls -b
wird angezeigt \rfoo
.
Wenn Sie also rm .?~
eingeben, stimmt es überein, weil in diesem Fall Ihre ?
Eingabe von der Shell als Platzhalter interpretiert wird, der mit jedem einzelnen Zeichen übereinstimmt, nicht unbedingt mit einem tatsächlichen Fragezeichen. Sie haben rm
einen Alias verwendet, rm -i
sodass Ihre Aktion bestätigt wird. Dabei wird der Escape-Code im C-Stil angezeigt.
Antwort2
Das seltsame Zeichen in diesem Dateinamen (angezeigt durch rm
) ist das Zeichen 0177
( 0x7F
h / 127
d ). Das ist das Del
Zeichen.
Die Bash-Autovervollständigung scheint damit nicht konsistent umzugehen.
ls
druckt ein ?
für nicht druckbare Zeichen (standardmäßig). Versuchen Sie:
$ echo a > .$'\x7f'~
$ ls -b .??
.\177~
rm
ist hilfreich und druckt seinen Oktalwert.
Antwort3
Wenn Sie die TAB-Taste drücken und die Shell eine Art Dateinamen-Rate vornimmt, druckt sie zwei Zeichen, „^“ und „?“ für den Oktalwert 177. Sie können einen Dateinamen mit einem Byte dieses Werts erhalten, indem Sie zum Testen Strg-V und dann Umschalt-Strg-?“ (drei Tasten gleichzeitig) drücken.
Der Dateiname war nicht Punkt-Caret-Fragezeichen-Tilde, sondern Punkt-Oktal 177-Tilde. Verschiedene Programme haben das Byte mit dem Oktalwert 177 auf unterschiedliche Weise dargestellt.