날짜 명령이 Linux 사양을 따르지 않음 (Mac OS X Lion)
나는 꽤 오랫동안 내 리눅스 상자에서 스크립트를 개발해 왔으며 내 Mac에서도 실행하고 싶었습니다.
맥의 기능은 리눅스의 기능과 같다고 생각했지만 오늘은 틀렸다는 것을 깨달았습니다. Mac에 존재하는 기능이 적다는 것을 알고 있었지만 존재하는 기능이 동일한 구현을 가지고 있다고 생각했습니다.
이 문제는 특히 date
명령 과 관련이 있습니다 .
나노초 단위의 시간을 제공하는 매개 변수를 사용하여 Linux 시스템에서 명령을 실행하면 올바른 결과가 표시되지만 Mac에서 실행하면 해당 옵션이 없습니다.
Linux-Machine> date +%N
55555555555 #Current time in nanoseconds
Mac-Machine> date +%N
N
Mac에서 bash 명령으로 현재 시간을 나노초 단위로 가져 오는 방법은 무엇입니까?
최악의 경우는 C 등의 시스템 함수를 호출 한 다음 스크립트 내에서 호출하는 작은 코드를 만드는 것입니다.
어떤 도움이라도 대단히 감사합니다!
이는 OSX와 Linux가 두 가지 다른 도구 세트를 사용하기 때문입니다. Linux는 date
명령 의 GNU 버전을 사용합니다 (따라서 GNU / Linux). Linux는 Linux이고 OS X는 Unix입니다. 그들은 다릅니다.
MacPortsdate
에서 "coreutils"패키지에 포함 된 GNU 명령을 설치할 수 있습니다 . 시스템에 . 그것을 사용하거나 바이너리를 새로운 바이너리 와 연결할 수 있습니다 . 당신의 선택.gdate
date
gdate
man date
1 초를 넘지 않음을 나타냅니다. 다른 언어 (Python 2)를 사용하는 것이 좋습니다.
$ python -c 'import time; print repr(time.time())'
1332334298.898616
Python 3의 경우 다음을 사용합니다.
$ python -c 'import time; print(repr(time.time()))'
"Linux 사양"이 있지만 date
명령 의 동작을 많이 조절하지는 않습니다 . 당신이 가지고있는 것은 정반대입니다. Linux (또는 더 구체적으로 GNU 사용자 공간 도구)에는 합당한 정의로 인해 Unix 와 호환되지 않는 많은 확장이 있습니다 .
표준의 큰 숫자가 어떻게 이러한 것들을 규제는. 당신이보아야 할 것은 POSIX 입니다.
date [-u] [+format]
그리고 구현을 고수함으로써 더 이상 지원할 것은 없습니다. (여러분이보고 싶은 XPG 및 SUS와 같은 다른 표준도 있지만, 적어도 요즘에는 POSIX를 요구하고 기대해야합니다.
POSIX 문서에는 많은 예제가 포함되어 있지만 날짜 변환 에 대한 것은 없지만 많은 스크립트가 사용하는 실용적인 문제 date
입니다. 또한 구체적인 문제의 경우 POSIX에서 1 초 미만의 정확도로 시간을보고 할 수 없습니다.
어쨌든, * BSD가 리눅스가 아니라고 주장하는 것은 여기서별로 도움이되지 않습니다. 차이점이 무엇인지 이해하고 방어 적으로 코딩하면됩니다. 요구 사항이 복잡하거나 비정상적인 경우에는 표준 설치에서 이러한 유형의 날짜 형식 지정 작업을 거의 즉시 수행하는 Perl 또는 Python과 같은 스크립팅 언어로 전환 할 수 있습니다 (Perl이나 Python은이를위한 빠르고 우아한 방법이 없지만 상자에서 날짜 변환을 수행하십시오 . 솔루션은 다소 고문되는 경향이 있습니다).
실제적으로 MacOS date
man 페이지 와 Linux man 페이지를 비교하고 요구 사항을 조정 해 볼 수 있습니다.
실제 요구 사항에 따라 MacOS date
는 나노초 정확도의 형식 문자열을 지원하지 않지만 명령 실행에 상당한 수의 나노초가 소요될 때 해당 규모에서 유용한 결과를 얻을 가능성도 없습니다. 나는 밀리 초 수준의 정확도 (마지막 숫자의 실행 시간에 의해 버려 질 것임)에 안주하고 곱하여 나노초 단위로 숫자를 얻습니다.
nanoseconds () {
python -c 'import time; print(int(time.time()*1000*1000*1000))'
}
( print()
Python 3 에 대한 인수 주위의 괄호에 유의하십시오.) Python 이 나노초 정확도로 값을보고 한다는 것을 알 수 있습니다 (마지막 숫자는 종종 0이 아님). 실행했을 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
파이썬 을 시작 하고 값을 인쇄하는 오버 헤드 는 아마도 현실적으로 몇 배의 오버 헤드를 추가 할 것이지만 나는 그것을 정량화하려고 시도하지 않았습니다. (에서 출력 timeit
은 초 단위입니다.)
'programing' 카테고리의 다른 글
세션 변수에 대한 제한이 있습니까? (0) | 2021.01.15 |
---|---|
Mac OS X 10.6.7 Java 경로 현재 JDK 혼동 (0) | 2021.01.15 |
ID에 마침표가 포함 된 경우 ApiController가 404를 반환합니다. (0) | 2021.01.15 |
Facebook 페이지에 대한 "만료되지 않는"액세스 토큰 생성 (0) | 2021.01.15 |
Java의 상속으로 인해 얼마나 많은 객체가 생성됩니까? (0) | 2021.01.15 |