Der Schalter -r des FreeBSD-Datumsdienstprogramms verwirrt mich

Der Schalter -r des FreeBSD-Datumsdienstprogramms verwirrt mich

Ich habe ein Bash-Skript, das ich von Linux nach FreeBSD konvertieren muss, aber ich bin offensichtlich zu dumm, um die Manpage richtig zu lesen.

Das Skript enthält die folgende Zeile:

date +%d -r "$file"

das funktioniert gut unter Linux, gibt aber nur

date: illegal time format

unter FreeBSD.

DerLinux-Manpagebesagt, dass dies -rzur Angabe der Referenzdatei verwendet wird:

   -r, --reference=FILE
          display the last modification time of FILE

Was mich hier verwirrt, ist, dass dieFreeBSD-Manpageenthält die gleiche Verwendung für diesen Schalter, bietet aber auch eine alternative:

 -r seconds
     Print the date and time represented by seconds, where seconds is
     the number of seconds since the Epoch (00:00:00 UTC, January 1,
     1970; see time(3)), and can be specified in decimal, octal, or
     hex.

 -r filename
     Print the date and time of the last modification of filename.

Offensichtlich resultieren die obigen Fehlermeldungen aus der Erwartung eines UNIX-Zeitstempels als Parameter für den -rSchalter anstelle des angegebenen Dateinamens.

Was ich nicht verstehe, ist, wie ich klarstellen soll, dass ich die zweite Interpretation des -rSchalters verwenden möchte. Wenn dies aus dem Kontext des Anrufs abgeleitet werden soll, bin ich verwirrt, wie ich diesen Kontext bereitstellen soll.

Kann mir bitte jemand erklären, wie ich dem Datumsdienstprogramm mitteilen soll, welchen Anwendungsfall des -rSchalters ich hier verwenden möchte?

Antwort1

Es sieht so aus, als ob diese -rVerwendung erst in die Quellen gelangte auf7. Mai 2015. Vielleicht kann Ihre Version das noch nicht?

Revision 282608 - (view) (download) (annotate) - [select for diffs] 
Modified Thu May 7 20:54:38 2015 UTC (12 months, 1 week ago) by delphij 

date(1): Make -r behave like GNU's version when the option can not be
interpreted as a number, which checks the file's modification time and
use that as the date/time value.

Antwort2

Das Skript enthält die folgende Zeile:

Datum +%d -r "$Datei"
das unter Linux gut funktioniert, aber …

… schlägt unter FreeBSD/PC-BSD fehl, da der dateBefehl seine Befehlszeilen mit analysiert getopt()und Optionen strikt vor Argumenten stehen müssen. Die Formatzeichenfolge +%dist ein Argument und muss der -rOption folgen; andernfalls -rwird sie nicht als Option erkannt, sondern als (ungültiges) Argument behandelt. Beachten Sie, dass die Befehlsübersicht auf der dateHandbuchseite sie in genau dieser Reihenfolge anzeigt.

Ja, datebehandelt die Optionsargumente -rnur dann als Dateinamen, wenn sie nicht als Zahlen dekodiert werden können. Ja, das ist ein Problem, wenn die Dateinamen Zahlen sind. ☺

Ein besserer Ansatz zum Lesen des letzten Änderungszeitpunkts einer Datei/eines Verzeichnisses, ohne sich darum zu kümmern, ob der Name zufällig einer Zahl ähnelt oder nicht, wäre der statBefehl … hätte dieser nicht selbst erhebliche Schwierigkeiten.

Fall "`uname`" in
Linux) stat -c '%y' -- "$1"|cut -c9-10 ;;
*BSD) stat -f '%Sm' -t '%d' -- "$1" ;;
esac

verwandte Informationen