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
  • 正如所指出的,在您的尝试中,
    `…`
    中的命令在
    xargs
    运行之前进行计算,结果是一个literal
    (由于将literal
    @
    传递给
    echo
    ,它只输出
    @
    ,因为
    sed
    命令找不到任何可替换的内容),它
    xargs
    然后简单地用它的输入原样替换;正如特瓦尔伯格所说:你实际上是在跑步
    echo'who are you'| xargs-i@echo@
    ,一个虚拟的no-op,保留对前导和尾随空格的潜在微调

  • 通常,
    xargs
    只能调用外部实用程序,如果您需要需要具有shell功能的命令(如管道),则必须使用包含shell命令的单个字符串显式调用shell二进制文件,即。,一个特殊脚本-在被
    xargs
    调用时由该shell实例进行计算

  • sh-c
    使用指定的脚本(包含shell命令的字符串)调用
    /bin/sh
    进行求值,最安全的方法是将
    xargs
    '参数作为位置参数传递给该脚本;请注意,脚本后的第一个参数绑定到脚本中的
    $0
    ,因此使用了伪值
    ,后面是
    @
    xargs
    的替换字符串,其扩展值将绑定到脚本中的
    $1

  • 'echo“$1”| sed“s/who/where/”
    因此充当一个特殊的shell脚本,将其第一个位置参数(通过
    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@
,正如您所注意到的,这有点毫无意义。。。