2017-09-12 12 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 

I)は、バッククォートまたは$を(使用構築そうすること$ 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は、3つの一意の値を与え、$ BASH_SUBSHELL値は直接エコーの場合に0として保持されます。しかし、上記の方法では、私たちは2になります。エントロピーが減った!! –

+0

@ thesudhakarまあ、それは直接エコーではありません。パイプを使用したときにフォークを作成しました。エントロピーについては、私はなぜあなたが['uuidgen'](http://man7.org/linux/man-pages/man1/uuidgen.1.html)のようなものを使うのではなく、これをやっているのか、真のUUIDを作成するためにPythonを使用しているので、私はコメントしません。 – muru

+0

私には何があるのか​​、何の意味があるのか​​は分かりません。パイプについては、 'foo | bashは分岐し、 'foo'と' bar'を独立して実行します。 'printf'にパイプはなく、' printf'は組み込み関数なので、分岐はありません。 – muru