Wie funktioniert Git-Bash für Windows 'rm'?

8

Unter bestimmten Umständen löscht der rm -Befehl in Git-Bash Dateien, die nicht im Explorer, in der cmd-Eingabeaufforderung, in PowerShell oder mit C ++ - Standardbibliotheksaufrufen gelöscht werden können.

Warum?

Das ist verwirrend für mich, weil ich weiß, dass es hier keine Magie gibt und ich nehme an, dass sie alle dieselbe Win32-API verwenden.

Ich habe beispielsweise Datenbank-Snapshots, die offen bleiben und nicht mit den anderen beschriebenen Methoden gelöscht werden können, aber erfolgreich von Git-Bash rm :

gelöscht wurden

Explorer löschen: "Die Aktion kann nicht abgeschlossen werden, da die Datei geöffnet ist."

cmd: del <path> : "Zugriff verweigert"

PS: Remove-Item -Force -Path <path> : "Element kann nicht entfernt werden. Der Zugriff auf den Pfad wurde verweigert."

C ++ remove() : gibt -1

zurück

C ++ unlink() : gibt -1

zurück

C ++ _unlink() : gibt -1

zurück

git-bash rm <path> : Erfolg

Das oben genannte kann für verschiedene Dateien wiederholt durchgeführt werden.

Es gibt andere gesperrte Dateien, die git-bash rm erfolgreich löscht (ich habe es in der Vergangenheit benutzt, nicht kürzlich und ich habe keine anderen spezifischen Beispiele).

Aber es funktioniert nicht immer: In einer Testanwendung habe ich eine Textdatei mit fopen() geöffnet und keine der Methoden, einschließlich Git-Bash rm , konnte sie erfolgreich löschen.

Also, wie funktioniert Git-Bash rm?

    
apamburn 23.01.2018, 02:40
quelle

1 Antwort

4

Ich konnte herausfinden, wie das funktioniert.

Interessanterweise habe ich das Strace-Dienstprogramm von Git-Bash für den Befehl rm verwendet.

Es stellt sich heraus, dass Git Bash CygWin verwendet und die Löschroutine in gefunden wird CygWin syscalls.cc-Datei , die versucht, eine Datei auf verschiedene Arten zu löschen.

Schließlich wird versucht, die Datei in den Papierkorb zu verschieben, wo sie die gesperrte Datei löscht, indem sie mit dem Windows-Treiber NtOpenFile () mit einem FILE_DELETE_ON_CLOSE-Flag geöffnet und dann mit NtClose () geschlossen wird.

Ich bin mir nicht sicher, ob es richtig wäre, den Code von CygWin in die Antwort hier zu kopieren, aber Details zu all dem finden Sie in dem angegebenen Link.

    
apamburn 08.02.2018 18:12
quelle

Tags und Links