Kau*_*kar 56 macos bash scripting porting date
我已经在linux盒子上开发了一段脚本很长一段时间了,并且想在我的Mac上运行它.
我认为Mac上的功能与linux上的功能相同,但今天我意识到这是错误的.我知道Mac上存在的功能较少,但我认为确实存在的功能具有相同的实现.
此问题特别针对date
命令.
当我在我的linux机器上使用参数运行命令以提供一些时间(纳秒)时,我得到了正确的结果,但是当我在我的mac上运行它时,它没有那个选项.
Linux-Machine> date +%N
55555555555 #Current time in nanoseconds
Mac-Machine> date +%N
N
Run Code Online (Sandbox Code Playgroud)
如何在Mac上以bash命令获取当前时间(以纳秒为单位)?
最糟糕的情况是我创建了一小段代码,用C或其他东西调用系统函数,然后在我的脚本中调用它.
任何帮助深表感谢!
Joe*_*nux 71
这是因为OSX和Linux使用两组不同的工具.Linux使用GNU版本的date
命令(因此,GNU/Linux).请记住,Linux是Linux,OS X是Unix.他们是不同的.
您可以安装MacPorts中date
包含的"coreutils"包中的GNU 命令.它将作为安装在您的系统上.您可以使用它,也可以将二进制文件与新二进制文件链接; 你的选择.gdate
date
gdate
man date
表明它不会超过一秒钟.我建议尝试另一种语言:
$ python -c 'import time; print repr(time.time())'
1332334298.898616
Run Code Online (Sandbox Code Playgroud)
不要在OS X呻吟,在BSD呻吟:-P
有“Linux 规范”,但它们并没有date
过多地规范命令的行为。你所拥有的恰恰相反——Linux(或者更具体地说是 GNU 用户空间工具)有大量的扩展,根据任何合理的定义,这些扩展与Unix不兼容。
有大量标准确实规范了这些事情。您应该查看的是POSIX,它需要
date [-u] [+format]
Run Code Online (Sandbox Code Playgroud)
并没有更多的东西可以通过坚持实现来支持。(还有其他标准,如 XPG 和 SUS,您可能也想查看,但至少,这些天您应该要求并期待 POSIX ......终于。)
POSIX 文档包含许多示例,但没有用于日期转换的内容,但这是许多脚本转向的实际问题date
。此外,对于您的具体问题,在 POSIX 中没有任何用于以亚秒级精度报告时间的内容。
无论如何,在这里抱怨 *BSD 不是 Linux 并没有什么帮助;你只需要了解差异是什么,并防御性地编码。如果您的需求很复杂或不寻常,也许可以求助于像 Perl 或 Python 这样的脚本语言,它们在标准安装中或多或少地开箱即用地执行这些类型的日期格式化操作(尽管 Perl 和 Python 都没有一种快速而优雅的方式来执行)也可以开箱即用地进行日期转换;解决方案往往会受到一些折磨)。
实际上,您可以比较MacOSdate
手册页和Linux手册页并尝试调和您的要求。
对于您的实际需求,MacOSdate
不支持任何具有纳秒精度的格式字符串,但是当命令的执行将花费大量纳秒时,您也不太可能收到该规模的有用结果。我会满足于毫秒级的精度(即使最后一位数的执行时间也会忽略这一点)并乘以获得纳秒级的数字。
nanoseconds () {
python -c 'import time; print(int(time.time()*1000*1000*1000))'
}
Run Code Online (Sandbox Code Playgroud)
(注意print()
Python 3的参数周围的括号。)您会注意到 Python确实以纳秒精度报告了一个值(最后一位数字通常不是零),但到您运行时,time.time()
该值显然不再正确.
要了解错误率,
bash@macos-high-sierra$ python3
Python 3.5.1 (default, Dec 26 2015, 18:08:53)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> import timeit
>>> def nanoseconds ():
... return int(time.time()*1000*1000*1000)
...
>>> timeit.timeit(nanoseconds, number=10000)
0.0066173350023746025
>>> timeit.timeit('int(time.time()*1000*1000*1000)', number=10000)
0.00557799199668807
Run Code Online (Sandbox Code Playgroud)
实际上,启动Python 和打印值的开销可能会增加几个数量级的开销,但我没有尝试对此进行量化。(输出timeit
以秒为单位。)