Почти я могу сказать от рассмотрения текущих источников ядра Linux, все ядро делает, проводят подсчет того, сколько ссылок это сопровождается, и это ошибки, если это больше, чем некоторое число. Посмотрите строку 1330 в namei.c для комментария, и nested_symlink()
функция. Макрос ELOOP (код ошибки, возвращенный из a read(2)
системный вызов этой ситуации), обнаруживается во многих местах в том файле, таким образом, это не может быть столь просто, как, считая ссылки сопровождаемыми, но это уверено, на что это похоже.
Существует много алгоритмов для нахождения "циклов" в связанных списках (алгоритм обнаружения цикла Floyd) или в ориентированных графах. Это не ясно мне, какой необходимо было бы сделать для обнаружения фактического "цикла" или "цикла" в конкретном пути. В любом случае алгоритмы могли занять много времени для выполнения, таким образом, я предполагаю, что просто подсчет количества перешедших символьных ссылок получает Вас 90% пути к Вашей цели.
Solaris date
не поддерживает параметр -d
, такой как GNU date
.
Вы можете использовать perl
:
$ perl -MPOSIX=strftime -le '@t = localtime; $t[3] = 1; $t[4]--; print strftime("%m", @t)'
05
$ perl -MPOSIX=strftime -le '@t = localtime; $t[3] = 1; $t[5]--; print strftime("%Y", @t)'
2013
Или, если у вас есть ksh93
:
$ printf "%(%m)T\n" "last month"
05
$ printf "%(%Y)T\n" "last year"
2013
Обновлено
Для комментария @ glennjackman я нашел документацию в Time Модуль :: Piece :
The months and years can be negative for subtractions. Note that there is some "strange" behaviour when adding and subtracting months
at the ends of months. Generally when the resulting month is shorter than the starting month then the number of overlap days is
added. For example subtracting a month from 2008-03-31 will not result in 2008-02-31 as this is an impossible date. Instead you will
get 2008-03-02. This appears to be consistent with other date manipulation tools.
Поскольку OP хочет получить только предыдущий год и месяц, мы можем установить $ t [3] = 1
, чтобы решить эту проблему.
Tcl имеет действительно хорошую реализацию даты и времени, если она у вас установлена:
tclsh <<END
puts [clock format [clock scan "-1 month"] -format "%m"]
puts [clock format [clock scan "-1 year"] -format "%Y"]
END
Корректировка идеи perl (Есть проблема с этим решением в январе, да?).
Последний месяц:
$ perl -MPOSIX=strftime -le '@t = localtime; @l = localtime (time - @t[3] * 86400); print strftime("%m", @l)'