2017-12-06 13 views
2

Auf Linux-Systemen, wenn Sie einen Befehl in einer Shell wie rm * -rf eingeben, ist die Reihenfolge der * und der -rf nicht wichtig. Meine Shell interpretiert es auf die gleiche Weise. Nun, auf meinem Mac, wenn ich schreibe rm -rf * alles funktioniert gut, aber wenn ich rm * -rf tun ein Fehler auftaucht rm: -rf: No such file or directorymacos Kommandozeile Parameter funktioniert nicht am Ende

Ich habe versucht, dass auf einem macOS und einem Linux sowohl mit Fisch und Bash-Shells. Gleiche Probleme.

Hat jemand eine Idee, warum der Befehlsinterpreter auf macOS denkt, dass -rf am Ende des Befehls nicht als Parameter des Befehls interpretiert wird?

+1

Es ist nicht der Befehlsinterpreter (die Shell), der sich unterscheidet; es ist der 'rm' Befehl. Herkömmlicherweise erfordern Unix-Befehle alle Optionen vor allen Nicht-Optionsargumenten. GNU-Dienstprogramme und solche, die im GNU-Stil geschrieben sind, erlauben es, Argumente für Optionen und Nicht-Optionen zu mischen. OSX ist ein BSD-Derivat, das ein eher traditionelles Verhalten zeigt. –

Antwort

1

Es geht nicht um die Shell, es geht um die Befehle. Das Parsen von Befehlszeilenargumenten ist keine Eigenschaft und Verantwortung der Shell, sondern der eigentlichen Befehle. In beiden Systemen übergibt die Shell die Befehlszeilenargumente genau in der Reihenfolge, in der sie angegeben wurden, und dann liegt es an der Implementierung der Befehle, sie so zu parsen, wie sie es für richtig halten.

In Linux sind die Kerndienstprogramme normalerweise von der GNU-Implementierung während auf OSX die Kerndienstprogramme normalerweise der BSD-Implementierung sind.

Die man Seite der Befehle sollte Ihnen sagen, welche Implementierung es ist.

Zum Beispiel die letzte Zeile von man rm in Linux ist so etwas wie dieses:

GNU coreutils 8.21    March 2016        RM(1) 

Auf osx:

BSD       January 28, 1999       BSD 
1

Reihenfolge der Argumente in jeder Schale war historisch in Unix relevant.

rm übrigens hat auch eine Option - Parsen Optionen zu stoppen (können Dateien entfernen, die mit "-" zum Beispiel)

Siehe rm (1) und getopt (3) man-Seiten

wenn die Schale ist es gegeben, nur nicht Reihenfolge der Argumente respektieren, was würde diese Sequenz das Ergebnis sein:

$ touch a b 
$ mv a b 

welche Datei bleiben würde?