Shellscript评估命令vs命令差异:多个$(uuidgen)得到我相同的结果



假设uuidgen为每次调用生成一个随机uid。下面的命令:

╰─○ 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执行命令之前。所以你在运行:

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)'

最新更新