bash:有意义的唯一 id 生成
Posted
技术标签:
【中文标题】bash:有意义的唯一 id 生成【英文标题】:bash: meaningful unique id generation 【发布时间】:2018-02-20 17:07:43 【问题描述】:我正在使用以下命令为我的 shell 脚本生成一个唯一的 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
【讨论】:
我们可以看到 $$-$BASH_SUBSHELL-$BASHPID 给出了 3 个唯一值,在直接回显的情况下 $BASH_SUBSHELL 值保留为 0。但是通过上述方法,我们只得到 2。熵减少了! @thesudhakar 好吧,这不是直接的回应。您在使用管道时创建了一个分叉。至于熵,我完全不知道你为什么要这样做,而不是使用uuidgen
或 Python 之类的东西来创建真正的 UUID,所以我不会发表评论。
我不明白那东西有什么意义,或者为什么它必须有任何意义。至于管道,当您执行foo | bar
时,bash 分叉并独立运行foo
和bar
。 printf
不涉及分叉,因为没有管道,printf
是内置的。
同意。如前所述,我的要求是“有意义的”唯一ID。顺便说一句,这也是一个真正的唯一 ID。同样出于我的目的,这种方法更有保证。
这里的uid有以下含义:系统信息,bash shell信息,时间:这些是我们可以通过查看它来推断的一些东西,例如,当您使用它作为文件名时也可以在同一个 shell 下同时跨系统创建数百万个文件。【参考方案2】:
uuidgen
适用于 Linux (util-linux) 和 Mac OS(BSG 通用命令)。
见https://serverfault.com/questions/103359/how-to-create-a-uuid-in-bash
【讨论】:
以上是关于bash:有意义的唯一 id 生成的主要内容,如果未能解决你的问题,请参考以下文章