我需要在xargs调用中使用变量shell命令。
... xargs -I {} sh -c 命令 ...
我发现xargs在命令为'literal'时有效但在我通过shell变量指定时失败。
有任何疑问可以解决这个问题吗?
以下是示例代码。
## xargs call with literal shell command
# works; creates file abcd1234.txt containing string 'abcd1234'
echo 'abcd1234' | xargs -I {} -n 1 sh -c 'echo {} | grep "\d" > {}.txt'
## xargs call with variable as shell command
# create shell command to give to xargs
cmd1='echo'
cmd2='grep "\d"'
command=${cmd1}' {} | '${cmd2}' > {}.txt'
# returns the literal command that works: echo {} | grep "\d" > {}.txt
echo $command
# fails
echo 'abcd1234' | xargs -I {} -n 1 sh -c $(echo $command)
答案 0 :(得分:1)
尝试
echo 'abcd1234' | xargs -I {} sh -c "$command"
注意:我已从命令中删除了-n 1
,因为它与-I
相矛盾,这意味着逐行处理。
您没有在命令替换$(...)
周围使用双引号,这使得shell应用了单词拆分(通过空格拆分为令牌),这意味着多个参数被放置在-c
选项而不是单命令字符串。
除此之外,不需要涉及命令替换:直接使用 - 双引号 - 变量("$command"
)就足够了。