Ich habe einen Fehler im Befehl chown
von OS X 11.6 gefunden. Es scheint entgegen seiner Manpage zu funktionieren und das -f
Flag zu ignorieren.
T_MaceT 33 ) chown -f T_MaceT foo
chown: foo: No such file or directory
T_MaceT 34 ) echo $?
1
Laut der Manpage -f
sollte bei Verwendung von ignoriert werden, dass die Datei nicht existiert, und der Rückgabewert nicht geändert werden. (Zum Vergleich habe ich das korrekte Verhalten auf RedHat 6 getestet.)
Ich bin mir nicht sicher, wer (wenn irgendjemand) diese Art von Fehlern beheben würde. Die Manpage bezieht sich auf BSD. Gibt es ein aktives Projekt, das solche Dinge unterstützt?
Es ist kein Fehler, es ist eine schlecht geschriebene Dokumentation. Die -f
Option für chown
Staaten:
Melden Sie keinen Fehler beim Ändern des Dateieigentümers oder der Gruppe, und ändern Sie auch nicht den Exit-Status, um solche Fehler widerzuspiegeln.
Dies bedeutet, dass die -f
Option nur anwendbar ist, wenn die Zieldatei vorhanden ist und beim Ändern des Eigentümers oder der Gruppe der Datei ein Fehler aufgetreten ist , was Sie natürlich nicht für eine nicht vorhandene Datei wie im OP-Beispiel unter macOS tun können.
Um zu zeigen, dass die -f
Option tatsächlich wie beabsichtigt funktioniert, verwenden Sie den folgenden zusammengesetzten Befehl in Terminal, ohne dies mit root
oder zu tun sudo
:
touch ${TMPDIR}testfile; chown root ${TMPDIR}testfile; echo $?; rm ${TMPDIR}testfile
Die Ausgabe wird zB sein:
chown: /var/folders/7l/lcvbc47n3sd7jcztdhc9c_pw0000gn/T/testfile: Operation not permitted
1
In dieser ersten Form, ohne die -f
Option scheitert es, wird >0 beendet, da der chown
Befehl versucht, den Besitzer von ${TMPDIR}testfile
auf zu setzen root
, während er nicht als ausgeführt wird root
und nicht verwendet wird sudo
.
-f
Jetzt mit der Option ausführen :
touch ${TMPDIR}testfile; chown -f root ${TMPDIR}testfile; echo $?; rm ${TMPDIR}testfile
Die Ausgabe wird sein:
0
In dieser zweiten Form, mit der -f
Option , es gelingt, wird mit 0 beendet, ohne eine Änderung vorgenommen zu haben, weil es nicht als root
und ohne Verwendung von getan wurde sudo
, was notwendig ist, um den Eigentümer einer Datei in zu ändern root
.
Beachten Sie, dass die einzelnen Betriebssysteme chown
nicht in allen Funktionen gleich sind. Mit anderen Worten, obwohl ich Red Hat nicht habe, wie im OP erwähnt, habe ich Linux Mint zum Vergleichen, und die Manpage in Linux Mint gibt folgende -f
Optionchown
an :
die meisten Fehlermeldungen unterdrücken
Wie Sie sehen , ist das Schlüsselwort am meisten , es unterdrückt also nicht alle Fehlermeldungen in Linux Mint, noch ist die Beschreibung, was -f
mit unter Linux Mint passiert chown
, so detailliert und explizit wie unter macOS.
Während also in Linux Mint nicht as root
oder using sudo
, chown -f root non_existant_filename
keinen Fehler ausgibt, ist sein Exit-Code jedoch 1
, nicht 0
wie im chown
obigen macOS-Beispiel, -f
das innerhalb seines definierten Kontexts verwendet wird.
-f
Option zwischen Betriebssystemplattformen und / oder Versionen von nicht gleich ist chown
. Ich glaube, mein Test bestätigt, dass es unter macOS wie vorgesehen funktioniert. Allerdings gibt es andere Möglichkeiten zu codieren, um unerwünschte Ausgaben zu vermeiden. Ich gehe davon aus, dass Ihr Skript etwas enthält, in dem nur eine saubere Ausgabe angezeigt werden soll, da die -f
Option nicht wirklich benötigt wird, wenn ein einziger einmaliger Befehl auf der Befehlszeile ausgegeben wird. Fortsetzung im nächsten Kommentar.chown root nonexistant_filename 2>/dev/null
ausgeblendet . chown: nonexistant_filename: No such file or directory
Auch in Skripten gibt es einfache Möglichkeiten, um zu bestätigen, dass die Datei existiert, bevor Sie versuchen, darauf zu reagieren (und sollten dies wahrscheinlich in vielen Fällen tun). Wenn Sie dies jedoch wirklich als Fehler und / oder Designfehler verfolgen möchten, enthält der obige Kommentar von Big Mac einige Links, um dies zu erleichtern.fts
Funktionen werden verwendet, um die Dateihierarchie zu durchlaufen, ein Fehler bei stat
einer Datei führt zur Anzeige einer Warnung (suchen Sie nach FTS_ERR
). Das Verhalten ist also definitiv beabsichtigt. Man könnte argumentieren, dass es nicht mit cp
, mv
usw. konsistent ist, aber viele Unix-Binärdateien sind es nicht ( awk
z. B. verwendet -f
, um eine Skriptdatei zu übergeben).
Benutzer3439894
-f
sollte mit , ignoriert werden, dass die Datei nicht existiert, und der Rückgabewert nicht geändert werden. " Und das ist überhaupt nicht das, was die Manpagechown
unter macOS angibt!fd0
macetw
Big Mac