Вот один способ сделать это: набор dirnames
как завершение по умолчанию, и генерируют пользовательские завершения для второго аргумента.
_some_func () {
case $COMP_CWORD in
1) :;; # let the default take over
2) COMPREPLY=($(compgen -W "go unbind" "${COMP_WORDS[$COMP_CWORD]}"));;
*) COMPREPLY=("");;
esac
}
complete -F _some_func -d some_func
Вы могли также звонить compgen -d
когда $COMP_CWORD
1, но это не работает хорошо в ударе, потому что необходимо выйти из пробела в выводе compgen
, и Вы не можете отличить новую строку, которая разделяет два результата новой строки, которая содержится в завершении (редкий, но возможный).
date +%s.%N
даст Вам, например, 1364391019.877418748
. %N является числом наносекунд, истекших в текущую секунду. Заметьте, что это - 9 цифр, и датой по умолчанию заполнит это нулями, если это будут меньше чем 100 000 000. Это - на самом деле проблема, если мы хотим сделать математику с числом, потому что удар рассматривает числа с начальным нулем как восьмеричные. Это дополнение может быть отключено при помощи дефиса в полевой спецификации, таким образом:
echo $((`date +%s`*1000+`date +%-N`/1000000))
наивно дал бы Вам миллисекунды с эпохи.
Однако как Stephane Chazelas указывает в комментарии ниже, этому отличающиеся два года date
вызовы, которые уступят два немного отличающихся раза. Если второе перевернулось промежуточный их, вычисление будет всей секундой прочь. Так:
echo $(($(date +'%s * 1000 + %-N / 1000000')))
Или оптимизированный (благодаря комментариям ниже, хотя это должно было быть очевидно):
echo $(( $(date '+%s%N') / 1000000));
В случае, если любой использует другие оболочки, чем bash
, ksh93
и zsh
имейте плавающую точку $SECONDS
переменная, если Вы делаете a typeset -F SECONDS
который может быть удобным для измерения времени с точностью:
$ typeset -F SECONDS=0
$ do-something
something done
$ echo "$SECONDS seconds have elapsed"
18.3994340000 seconds have elapsed
Начиная с версии 4.3.13 (2011) zsh
имеет a $EPOCHREALTIME
специальная переменная с плавающей точкой в zsh/datetime
модуль:
$ zmodload zsh/datetime
$ echo $EPOCHREALTIME
1364401642.2725396156
$ printf '%d\n' $((EPOCHREALTIME*1000))
1364401755993
Обратите внимание, что это получено из этих двух целых чисел (в течение многих секунд и наносекунд) возвращенный clock_gettime()
. В большинстве систем это - больше точности, чем единственный C double
число с плавающей точкой может содержать, таким образом, Вы потеряете точность при использовании его в арифметических выражениях (за исключением дат за первые несколько месяцев 1970).
$ t=$EPOCHREALTIME
$ echo $t $((t))
1568473231.6078064442 1568473231.6078064
Для вычислений разницы во времени высокой точности (хотя я сомневаюсь относительно необходимости в больше, чем точность миллисекунды) можно хотеть использовать $epochtime
специальный массив вместо этого (который содержит секунды и наносекунды как два отдельных элемента).
Начиная с версии 5.7 (2018) strftime
оболочка, встроенная также, поддерживает a %N
формат наносекунды а-ля GNU date
и a %.
для определения точности, таким образом, количество миллисекунд, так как эпоха может также быть получена с:
zmodload zsh/datetime
strftime %s%3. $epochtime
(или снабженный в переменной -s var
)
Для предотвращения вычислений для получения миллисекунд командная строка, интерпретаторы JavaScript могут помочь:
bash-4.2$ node -e 'console.log(new Date().getTime())' # node.js
1364391220596
bash-4.2$ js60 -e 'print(new Date().getTime())' # SpiderMonkey
1364391220610
bash-4.2$ jsc -e 'print(new Date().getTime())' # WebKit
1364391220622
bash-4.2$ seed -e 'new Date().getTime()' # GNOME object bridge
1364391220669
Пакеты, содержащие те интерпретаторы на Ubuntu Eoan:
netsh> interface ipv4
netsh interface ipv4> add route
, что возвращает миллисекунды с эпохи Unix.[1129159].
В bash 5+ есть переменная с микро -секундной гранулярностью:$EPOCHREALTIME
.
Так:
$ echo "$(( ${EPOCHREALTIME//.} / 1000 ))"
1568385422635
Печатает время с начала эпохи (1/1/70 )в миллисекундах.
В противном случае вы должны использовать дату. Либо дата GNU:
echo "$(date +'%s%3N')"
Одна из альтернатив, перечисленных вhttps://serverfault.com/a/423642/465827
Или brew install coreutils
для OS X
Или, если ничего не помогает, скомпилируйте (gcc epochInµsec.c )эту программу на c (при необходимости отрегулируйте):
#include <stdio.h>
#include <sys/time.h>
int main(void)
{
struct timeval time_now;
gettimeofday(&time_now,NULL);
printf ("%ld secs, %ld usecs\n",time_now.tv_sec,time_now.tv_usec);
return 0;
}
Обратите внимание, что вызову любой внешней программы требуется время для чтения и загрузки с диска, запуска, выполнения и, наконец, для печати вывода. Это займет несколько миллисекунд. Это минимальная точность, которая может быть достигнута с помощью любого внешнего инструмента (, включая дату ).
$(($(date +'%s * 1000 + %N / 1000000')))
. Это все еще не имеет большого смысла, но было бы более надежным. – Stéphane Chazelas 27.03.2013, 18:24%N
не доступно в BSD и OS X. – orkoden 29.01.2015, 13:20