2017-09-12 18 views
0

다음 명령을 사용하여 쉘 스크립트의 고유 ID를 생성합니다. 하드 디스크에 중간 파일을 사용하지 않고 변수에서 출력을 캡처하고 싶습니다.bash : 의미있는 고유 ID 생성

echo `dmidecode –t 4 -s system-uuid`-$$-$BASH_SUBSHELL-$BASHPID-`date '+%Y%m%d_%H%M_%S_%N'` | tr '-' '_' 
    XXB3A1XX_81XX_4XX2_AXX4_XXXX62820BF_24115_0_8550_201709XX_1446_46_385924883 

내가 역 인용 부호를 사용하거나 수 $() 구성하지만 그렇게 $ BASH_SUBSHELL의 값을 변경하고 고유 ID의 가치를 희석하고.

하드 디스크를 사용하지 않고 변수 출력을 캡처하는 동안 $ BASH_SUBSHELL 값을 변경하지 않는 모든 솔루션을 환영합니다.

참고 : 예제의 결과는 부분적으로 X

답변

1

사용 printf으로 가려하고 형식 문자열에 변수를 저장한다 : 다음

format="%s-$$-$BASH_SUBSHELL-$BASHPID-%s" 
uuid=$(printf "$format" $(dmidecode –t 4 -s system-uuid) $(date '+%Y%m%d_%H%M_%S_%N') | tr - _) 

:

$ echo "$uuid" 
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX_11764_0_11764_20170912_1906_42_765827138 
$ echo `dmidecode –t 4 -s system-uuid`-$$-$BASH_SUBSHELL-$BASHPID-`date '+%Y%m%d_%H%M_%S_%N'` | tr '-' '_' 
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX_11764_0_11865_20170912_1909_28_405748643 
+0

은 우리가 볼 수있는 $$ - $ BASH_SUBSHELL- $ BASHPID는 직접적인 반향의 경우 0으로 유지되는 $ BASH_SUBSHELL 값으로 3 개의 고유 값을 제공합니다. 그러나 위의 방법으로 우리는 2를 얻습니다. 엔트로피가 줄어 들었습니다 !! –

+0

@thesudhakar 음, 그건 직접적인 반향이 아닙니다. 파이프를 사용할 때 포크를 만들었습니다. 엔트로피에 관해서, 나는 왜''uuidgen' (http://man7.org/linux/man-pages/man1/uuidgen.1.html)과 같은 것을 쓰는 대신에 당신이 이것을하는지 가장 희미한 생각이 없다. 또는 진정한 UUID를 만들 파이썬, 그래서 나는 코멘트하지 않을 것이다. – muru

+0

나는 그 물건이 가지고있는 의미가 무엇인지, 왜 그것이 전혀 의미가 있어야 하는지를 보지 못합니다. 파이프에 관해서는'foo | bash는 fork하고, 독립적으로'foo'와'bar'를 실행합니다. 파이프가없고'printf'가 내장되어 있기 때문에'printf'에 관여하지 않습니다. – muru