Die automatische Vervollständigung von Bash gibt einen anderen Dateinamen aus als ls

Die automatische Vervollständigung von Bash gibt einen anderen Dateinamen aus als ls

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 -bFlag ist wichtig, aber da Ihre Datei mit einem Punkt beginnt, benötigen Sie -aauch Folgendes):

$ ls -ab
.  ..  .\177~

Ohne das -bwird es nur als angezeigt, .?~nicht weil das einfach weggelassen wird ^, sondern weil alle nicht druckbaren Zeichen als angezeigt werden ?. Versuchen Sie es mit touchctrl+ VEnterfooEnterund dann mit ls. Die angezeigte Datei ist ?foo. Dann ls -bwird 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 rmeinen Alias ​​verwendet, rm -isodass 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( 0x7Fh / 127d ). Das ist das DelZeichen.

Die Bash-Autovervollständigung scheint damit nicht konsistent umzugehen. lsdruckt ein ?für nicht druckbare Zeichen (standardmäßig). Versuchen Sie:

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

rmist 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.

verwandte Informationen