gpt4 book ai didi

bash - xargs : command substitution $(. ..) 管道不起作用

转载 作者:行者123 更新时间:2023-11-29 09:01:19 25 4
gpt4 key购买 nike

我正在尝试编写简短的脚本和以下命令:

echo "aaa111 bbb111" | xargs -I {} echo {} | sed 's/111/222/g'

返回 aaa222 bbb222,这正是我所期望的。

我期待下一个命令:

echo "aaa111 bbb111" | xargs -I {} echo $(echo {} | sed 's/111/222/g')

返回相同,但它返回 aaa111 bbb111!这是为什么?


UPD:我想要实现的目标:

我有很多文件,例如 pic30-coff-gccpic30-coff-ag 等,我需要为每个文件创建一个符号链接(symbolic link),例如 pic30-gcc -> pic30-coff-gcc

所以我这样写:

ls|grep 'coff-'|xargs -I {} ln -s {} $(echo {} | sed 's/coff-//g')

它不起作用:对于每个文件,它报告该文件存在。我检查了这样的命令:

ls|grep 'coff-'|xargs -I {} echo "ln -s {} $(echo {} | sed 's/coff-//g')"

是的,sed 部分不起作用:

ln -s pic30-coff-gcc pic30-coff-gcc
ln -s pic30-coff-gcc-4.0.3 pic30-coff-gcc-4.0.3
...

但如果我只是输入

echo "ln -s pic30-coff-gcc $(echo pic30-coff-gcc | sed 's/coff-//g')"

有效:

ln -s pic30-coff-gcc pic30-gcc

然后我用aaa111 写了测试命令,它也不起作用。还是不明白,为什么。

最佳答案

for循环答案正是我不是来这里阅读的。整目的xargs正在避免这个循环。 xargs对于这种特殊情况,可能不是最聪明的工具,但问题在于它。

这是我最终得到的解决方案。它可能并不完美,但仍然有效:

echo "aaa111 bbb111" | xargs -I {} sh -c "echo \$(echo {} | sed 's/111/222/g')"
# Outputs aaa222 bbb222

你可以想出同一个命令的不同变体:

echo "aaa111 bbb111" | xargs -I {} sh -c 'echo $(echo {} | sed "s/111/222/g")'
echo "aaa111 bbb111" | xargs -I {} sh -c "echo \`echo {} | sed 's/111/222/g'\`"

这里的要点只是调用一个新的 shell,它将在 xargs 之后执行命令替换。已替换 replace-str (这里是 {}),内容正确。

关于bash - xargs : command substitution $(. ..) 管道不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22589438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com