shell - 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 运行之前$(..)
,双引号内的命令替换"
被扩展。所以你正在运行:
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)'
推荐阅读
- angular - How to enable / disable a button based on a checkbox being checked in Angular
- swift - 如何在 Alamofire 中将数据传递给字典
- c# - 反序列化时将字符串转换为 DateTime
- sql - 无法根据“不在其中”进行过滤
- excel - Python 中是否有可用的库来创建加密的“受保护”excel 文件?
- haskell - 部分函数与输入验证
- android - 如何将数据从 1 个视图持有者传递到其他视图持有者
- oracle - 带有子句的 PL SQL 模糊搜索
- python - 如何在单词列表中找到元音的数量?
- php - 将 ID 转换为 slug 的中间件