Sie haben eine Datei mit einem lustigen Namen, wahrscheinlich beginnend mit a -
. Denken Sie daran, dass Globs (wie *
) durch Ihre Shell erweitert werden und nicht durch den ausgeführten Befehl. Angenommen, Sie haben:
$ ls -1
foo
-q
Einfach genug Verzeichnis mit zwei Dateien. (Die -1
Option zu coreutils ls
macht die Ausgabe einspaltig.)
Wenn Sie ausführen du -sh *
, stellt die Shell fest, dass das zweite Argument ein Sonderzeichen ( *
) enthält und nicht in Anführungszeichen steht, sodass die Glob-Erweiterung ausgeführt wird. Es erweitert es auf alles, was passt, in diesem Fall foo
und -q
. Der Effekt ist genau so, als würden Sie ausführen:
$ du -sh foo -q
du: invalid option -- 'q'
Try 'du --help' for more information.
Der obige Fehler ist klar: GNU-Dienstprogramme erlauben der Einfachheit halber Optionen, die mit Dateinamen gemischt werden. du
nimmt den Dateinamen -q
als Option. Und es gibt keine -q
Option. (Dies ist tatsächlich das Beste, was Sie erwarten können. Schlimmer wäre es, wenn es eine -q
Option gäbe , und es hat etwas Unerwünschtes bewirkt.)
Stépahanes Vorschlag ist, Ihren Globus in zu ändern ./*
, was dazu führen würde du -sh ./foo ./-q
- was natürlich als Dateiname verwendet wird, da er nicht mehr mit beginnt -
. Die andere Option, die er vorschlägt, ist die Verwendung --
, die den GNU-Dienstprogrammen mitteilt, dass es keine weiteren Optionen gibt - nur Datei- / Verzeichnisnamen.
Eigentlich solltest du immer entweder … ./*
oder … -- *
anstelle von verwenden *
, aber wir sind alle faul ... Seien Sie vorsichtig, insbesondere wenn Sie nicht allen Dateinamen vertrauen.
du -sh ./*
oderdu -sh -- *