Ich frage mich, ob sich diese beiden Befehle unterscheiden (dh nur die Reihenfolge ihrer Optionen ist unterschiedlich):
tar -zxvf foo.tar.gz
tar -zfxv foo.tar.gz
Der erste lief perfekt, aber der zweite sagte:
tar: You must specify one of the `-Acdtrux' or `--test-label' options
Try `tar --help' or `tar --usage' for more information.
Und Teer mit --test-label
und -zfxv
sagte:
tar (child): xv: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
Dann habe ich mir das Handbuch für den Teer angesehen und festgestellt, dass -f
am Ende alle Beispiele den Schalter verwenden !!
AFAICT gibt es keine Notwendigkeit für diese Einschränkung, oder gibt es ?! denn aus meiner sicht sollten schalter umsonst bestellt werden.
linux
command-line
tar
Khikho
quelle
quelle
gtar option parsing
, haben Sie einen weiteren Grund gefunden, warum Sie gtar nicht verwenden.-f
erwartet, dass der Dateiname folgt. In Ihrer zweiten Version haben Sie angegeben-fxv
, was - für tar - bedeutet, dass der Dateiname "xv" ist.Antworten:
Wenn Sie sich Ihre Fehlermeldung ansehen, ist es offensichtlich, dass Sie sie nicht verwendet haben,
tar
sondern ehergtar
.Im Allgemeinen kann dies helfen, Dinge zu verstehen:
tar
benötigt normalerweise immer ein Dateiargument. Wenn es fehlt, liest / schreibt es von / auf das Standard-Real-Bandgerät des Systems.star
änderte dies 1982, um standardmäßig stdin / stdout zu verwenden, und einige andere tar-Implementierungen (z. B. gtar) folgten kürzlich diesem Beispiel.tar
implementiert nicht die führenden-
Optionen für Optionen, diekey letters
im Fall des Befehls tar aufgerufen werden . Einige Implementierungen wurden später aus Gründen der-
Benutzerfreundlichkeit als "no-op" -Schlüssel hinzugefügt , Sie können sich jedoch nicht darauf verlassen.Die Art und Weise, wie
tar
die Argumente analysiert werden (insbesondere das Argument der Archivdatei), ist sehr riskant. Ich habe viele tar-Archive gesehen, die eine der Dateien zerstört haben, die sich im Archiv befinden sollten, da das zugehörige Dateiargument als tar-Archivdatei verwendet wurde.star
Aus diesem Grund kannstar
"f" (wenn nativ als " aufgerufen" ) nicht mit anderen Optionen verknüpft werden. Wennstar
aufgerufen wirdtar
, implementiert es die Kompatibilität mit der Befehlszeiletar
, behandelt das Argument für den Schlüsselbuchstaben "f" jedoch anders: Das Argument ist nur zulässig, wenn es sich auf eine echte Gerätedatei bezieht oder wenn die Datei (im Schreibmodus) noch nicht vorhanden ist .Ich empfehle, die riskante ursprüngliche tar-Befehlszeile zu vermeiden und lieber die moderne, sicherere Befehlszeilensyntax zu verwenden, mit der Sie arbeiten
star
.Wegen der problematischen Kommandozeilensyntax
tar
gab estar wars
Anfang der 1990er Jahre die sogenannten . Infolgedessen wurde das Programmpax
(lateinisch für "Frieden" in den Teerkriegen) erstellt und standardisiert.pax
Popularität erlangte es jedoch nicht, da seine Syntax weniger riskant, aber auch weniger intuitiv ist als die tar-Syntax. Ein anderes Problem kann sein, dassgpax
es mehr oder weniger ungepflegt ist.quelle
star
?tar
undcpio
.star
‚s-f"$file"
ist auch (zusätzlich zuind
) ein Problem mit Dateinamen beginnen mit=
. Also muss man es entweder-f="$file"
oder schreiben-f "$file"
. Ich bin nicht sicher, ob ich Ihre Star-Option als sicherer oder moderner bezeichnen würde .-long
Style Long-Optionen sind mit Condensed-xyz
Short-Optionen oder nicht kompatibel-xarg
. Aus diesem Grund erfordern lange Optionen im X11-Stil, dass kurze Optionen getrennt (-x -y
, nicht-xy
) und Optionsargumente in getrennten Argumenten (xterm -n foo
, nichtxterm -nfoo
) angegeben werden. Und deshalb gibt es einen zusätzlichen Gedankenstrich in GNU-Long-Optionen, um die mögliche Verwechslung mit Short-Optionen zu beseitigen, und warum GNU-Long-Optionen ein besseres Design sind. Sie können nur-foo
koexistieren,-x -y -xy
wenn Sie sehr vorsichtig sind, um Überschneidungen zu vermeiden.Die Reihenfolge der Schalter ist frei, es
-f
gibt jedoch ein obligatorisches Argument für die Datei,tar
die gelesen / geschrieben werden soll.Du könntest es tun
und das wird funktionieren und erfordert eine unspezifische Reihenfolge von Schaltern.
So funktionieren alle Befehle mit Optionen, die Argumente haben.
quelle
-f=./myfile
, das heißt, f nimmt einen Wert an, es ist kein Flag, es ist eine Eingabe.Traditionell tar Optionen sind mehr oder weniger „ um frei“ (die Reihenfolge der
f
undb
Optionen machen unabhängig davon , ob beide angegeben werden). Die Verwendung eines führenden Bindestrichs führt jedoch dazu, dass GNU tar die Optionen auf eine Weise analysiert, die als konsistenter mit anderen Befehlen angesehen wird. Wenn Sie eine Option angeben, für die ein Argument erforderlich ist (z. B. der Dateiname fürf
), wird der Rest des "Wortes" sofort verbraucht. falls vorhanden, als Argument (traditionell verwendet tar das nächste Wort als Dateiname / Blockgröße, wennf
oderb
angegeben wird). In Ihrem Fall wurde "xv" als Dateiname verwendet.Für die Portabilität kann dieses Verhalten jedoch nicht herangezogen werden. Um eine maximale Portabilität zu erzielen, sollten Sie die Verwendung eines Bindestrichs vermeiden, immer den
f
letzten und immer ein Leerzeichen zwischenf
und dem Dateinamen einfügen. Dies ist jedoch eine Vereinfachung, die sich aufteilt, wenn Sie dieb
Option oder generell eineC
andere Option (z. B. )f
benötigen, für die ein Argument erforderlich ist.Dies ist im Abschnitt "Die drei Optionsstile" des Tar-Handbuchs dokumentiert . Einige andere Implementierungen (zB FreeBSD) bezeichnen die alten Optionen als "gebündeltes Optionswort". Und natürlich unterstützen einige Implementierungen möglicherweise nur diese Art von Option und ignorieren möglicherweise einen Gedankenstrich, wenn er enthalten ist. Dies ist die einzige Form des Aufrufs, die in der Single Unix-Spezifikation angegeben ist, und funktioniert daher garantiert auf fast allen Systemen.
quelle
C
in BSD oder GNU tar. Schily tar unterstützt dies als -C, aber nicht als C, alle unterstützen dies als -C).In Teer ist der - in den Schaltern vor vielen Jahren veraltet und nicht mehr notwendig. Eigentlich hat Tar dir das gesagt, aber das tut er nicht mehr.
quelle