首页 > 解决方案 > Shellscript 评估命令与命令的差异:多个 $(uuidgen) 得到相同的结果

问题描述

uuidgen假设为每次调用生成一个随机 uuid。思考以下命令:

╰─○ cat a.txt | xargs -I {} -L 1 sh -c "uuidgen"
54693322-1ABF-4FCB-96E5-90EC0F4AC33E
9F1BA4CF-5612-46D7-90E9-EE653F0396FE
25F5D853-03BA-42F7-9FF8-1D3E124D09B3
046A348E-3FC0-414A-8469-21A016147245

这很好,但下面的命令会给我相同的 uuid:

╰─○ cat a.txt | xargs -I {} -L 1 sh -c "echo $(uuidgen)"
7477A621-331C-4727-8471-677528BC79AC
7477A621-331C-4727-8471-677528BC79AC
7477A621-331C-4727-8471-677528BC79AC
7477A621-331C-4727-8471-677528BC79AC

标签: shell

解决方案


在命令由 shell 运行之前$(..),双引号内的命令替换"被扩展。所以你正在运行:

xargs -I {} -L 1 sh -c "echo 7477A621-331C-4727-8471-677528BC79AC"

并且每次都会打印相同的值。使用set -x. 见xargs -t输出。使用 shellcheck.net 检查您的脚本。

如果您想将字符串echo $(uuidgen)按原样传递给由xargs您生成的 shell,则必须引用它。

xargs sh -c "echo \$(uuidgen)"
# or
xargs sh -c 'echo $(uuidgen)'

推荐阅读