Shell sed在backtick扩展中,使用xargs,不替换输入字符串
预期产出:Shell sed在backtick扩展中,使用xargs,不替换输入字符串,shell,sed,xargs,backticks,Shell,Sed,Xargs,Backticks,预期产出: echo "who are you" | xargs -i@ echo `echo @ | sed "s/who/where/"` where are you 实际产出: echo "who are you" | xargs -i@ echo `echo @ | sed "s/who/where/"` where are you 注意-这不是实际的用例,而是一个示例测试用例。必须稍微修改扩展顺序: who are you 在您的示例中,命令替换发生在shell启动命令之前:
echo "who are you" | xargs -i@ echo `echo @ | sed "s/who/where/"`
where are you
实际产出:
echo "who are you" | xargs -i@ echo `echo @ | sed "s/who/where/"`
where are you
注意-这不是实际的用例,而是一个示例测试用例。必须稍微修改扩展顺序:
who are you
在您的示例中,命令替换发生在shell启动命令之前:
echo "who are you" | echo "`sed "s/who/where/"`" | xargs -I@ echo "@"
命令替换执行以下操作:
echo "who are you" | xargs -i@ echo `echo @ | sed "s/who/where/"`
结果是,“@”
,因为sed只是打印出输入。
下一步是:
echo @ | sed "s/who/where/"
xargs使用标准输入“who is you”替换@
,并生成并运行以下命令:
echo "who are you" | xargs -i@ echo @
因此,最终您将获得输出:
echo "who are you"
我将假设实际用例确实需要xargs
;示例命令最简单的重新格式是echo'who are you'| sed's/who/where/'
要获得预期的行为,xargs
必须使用包含shell命令的字符串显式调用shell二进制文件sh
:
who are you
- 正如所指出的,在您的尝试中,
中的命令在`…`
运行之前进行计算,结果是一个literalxargs
(由于将literal
传递给@
,它只输出echo
,因为@
命令找不到任何可替换的内容),它sed
然后简单地用它的输入原样替换;正如特瓦尔伯格所说:你实际上是在跑步xargs
,一个虚拟的no-op,保留对前导和尾随空格的潜在微调echo'who are you'| xargs-i@echo@
- 通常,
只能调用外部实用程序,如果您需要需要具有shell功能的命令(如管道),则必须使用包含shell命令的单个字符串显式调用shell二进制文件,即。,一个特殊脚本-在被xargs
调用时由该shell实例进行计算xargs
使用指定的脚本(包含shell命令的字符串)调用sh-c
进行求值,最安全的方法是将/bin/sh
'参数作为位置参数传递给该脚本;请注意,脚本后的第一个参数绑定到脚本中的xargs
,因此使用了伪值$0
,后面是
,@
的替换字符串,其扩展值将绑定到脚本中的xargs
$1
因此充当一个特殊的shell脚本,将其第一个位置参数(通过'echo“$1”| sed“s/who/where/”
传递的参数)传递到xargs
以产生所需的输出sed
xargs
?显而易见、直截了当且正确的方法就是呼应“你是谁”| sed“s/who/where/”
。。。一个非常迂回但名义上正确的尝试可能是echo“who are you”| xargs-i@sh-c“echo”sed“s/who/where/”
我不是在尝试完成任何事情,我正在学习脚本,只是想知道这一行程序有什么问题。大家好,请忽略tilde之前的反斜杠。我认为您忽略了一个事实,即反斜杠中的任何内容(或者,bash
$(…)
语法)都是在管道的其余部分之前运行的。因此,您实际上正在运行echo“who are you”| xargs-i@echo@
,正如您所注意到的,这有点毫无意义。。。