xargs:命令替换$(...)与管道不起作用

Dmi*_*ank 5 bash pipe command-substitution

我正在尝试编写短脚本,以及以下命令:

echo "aaa111 bbb111" | xargs -I {} echo {} | sed 's/111/222/g'
Run Code Online (Sandbox Code Playgroud)

回归aaa222 bbb222,这是我所期待的.

我期待下一个命令:

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

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


UPD:我想要实现的目标:

我有很多文件,比如pic30-coff-gcc,pic30-coff-ag等等,我需要为每个文件创建一个符号链接,比如pic30-gcc- > pic30-coff-gcc等.

所以我写了这个:

ls|grep 'coff-'|xargs -I {} ln -s {} $(echo {} | sed 's/coff-//g')
Run Code Online (Sandbox Code Playgroud)

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

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

是的,这sed部分不起作用:

ln -s pic30-coff-gcc pic30-coff-gcc
ln -s pic30-coff-gcc-4.0.3 pic30-coff-gcc-4.0.3
...
Run Code Online (Sandbox Code Playgroud)

但如果我只是打字

echo "ln -s pic30-coff-gcc $(echo pic30-coff-gcc | sed 's/coff-//g')"
Run Code Online (Sandbox Code Playgroud)

有用:

ln -s pic30-coff-gcc pic30-gcc
Run Code Online (Sandbox Code Playgroud)

然后我写了测试命令aaa111,它也不起作用.还是无法理解,为什么.

Jer*_*ska 19

该for环路的答案正是我不是来这里阅读.整个目的xargs是避免这种循环.xargs可能不是这个特例的最聪明的工具,但问题是关于它.

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

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

您可以提出相同命令的不同变体:

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'\`"
Run Code Online (Sandbox Code Playgroud)

这里的要点仅仅是调用一个新的shell,它将用适当的内容xargs替换replace-str(here {})后执行命令替换.


ivi*_*caa 7

$(echo {} | sed's/111/222/g')在作为参数传递给xargs之前进行评估.它将返回"{}"

因此:

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

是相同的

echo "aaa111 bbb111" | xargs -I {} echo {}
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法让它与xargs一起使用? (3认同)

dev*_*ull -1

看来您所需要的只是一个简单的循环:

for file in *coff*; do
  ln -s "${file}" "${file/coff-/}"
done
Run Code Online (Sandbox Code Playgroud)