Поддержка GNU или Solaris 11 sleep
аргументов (одна или несколько
длительностей, поэтому также будет работать с традиционными реализациями, поддерживающими только одно десятичное целое число (например, на FreeBSD), но не с теми, кто принимает более сложные аргументы, такие как длительность ISO-8601 ). Использование etime
вместо etimes
, поскольку это более переносимо (стандартный Unix).
remaining_sleep_time() { # arg: pid
ps -o etime= -o args= -p "$1" | perl -MPOSIX -lane '
%map = qw(d 86400 h 3600 m 60 s 1);
$F[0] =~ /(\d+-)?(\d+:)?(\d+):(\d+)/;
$t = -($4+60*($3+60*($2+24*$1)));
for (@F[2..$#F]) {
s/\?//g;
($n, $p) = strtod($_);
$n *= $map{substr($_, -$p)} if $p;
$t += $n
}
print $t'
}
( s / \? // g
должен избавиться от символов ?
, которые procps
' ps
использует как замена управляющих символов. Без нее не удалось бы проанализировать sleep $ '\ r1d'
или sleep $ '\ t1d'
... К сожалению, в некоторых регионах, включая Локаль C
, он использует .
вместо ?
. В этом случае мы мало что можем сделать, так как невозможно определить \ t5d
из .5d
(полдня)).
Передайте идентификатор идентификатора в качестве аргумента.
Это также предполагает, что argv [0]
, переданный в sleep
, не содержит пробелов и что количество аргументов достаточно мало, чтобы оно не усекалось ps
.
Примеры:
$ sleep infinity & remaining_sleep_time "$!"
Inf
$ sleep 0xffp-6d &
$ remaining_sleep_time "$!"
344249
$ sleep 1m 1m 1m 1m 1m & remaining_sleep_time "$!"
300
Для вывода [[[ddd-] HH:] MM:] SS
вместо количества секунд замените print $ t
на :
$output = "";
for ([60,"%02d\n"],[60,"%02d:"],[24,"%02d:"],[inf,"%d-"]) {
last unless $t;
$output = sprintf($_->[1], $t % $_->[0]) . $output;
$t = int($t / $_->[0])
}
printf "%s", $output;
Это потому, что внутри [[…]]
операторы <и> выполняют сравнение строк.
При сравнении строк порядок задается (в основном) алфавитом, где a перед (меньше), чем b, и меньше, чем c: a .
Числа обычно перед (меньше) букв: 1 <2
Итак, как
сортируется после 1
abc
больше, чем 123
:
$ [[ abc > 123 ]] && echo yes
yes
Или, как вы это представляете:
$ x=abc y=123
$ [[ $x > $y ]] && echo yes
yes