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 分叉并独立运行foobarprintf 不涉及分叉,因为没有管道,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 生成的主要内容,如果未能解决你的问题,请参考以下文章

Python - 创建有意义的崩溃日志/崩溃报告

将 JSON 字符串转换为有意义的完整数据以进行解析

我应该在 HTTP 请求负载中使用 ID 号还是有意义的文本

java生成唯一ID

web端测试中常见的bug/最有意义的bug

web端测试中常见的bug/最有意义的bug多测师