Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux xargs和命令子项问题_Linux_Shell_Sh_Jq_Xargs - Fatal编程技术网

Linux xargs和命令子项问题

Linux xargs和命令子项问题,linux,shell,sh,jq,xargs,Linux,Shell,Sh,Jq,Xargs,因此,我有一个可怕的oneliner,它获取一个json值,使用jq从中提取数据,然后使用xargs对数据进行迭代。最后,它应该会生成一些xml legendary list installed--json{jq'.[].title'| sed s/“\”“/”/g | xargs-n1-p-d“\n”-I{}echo'{}” 首先,我没有在jq中使用-r标志,因为我认为问题可能来自它 预期输出应如下所示: 逃避现实者2 到目前为止,这是可行的(除了应用程序名称部分,因为这是它开始变得奇怪的

因此,我有一个可怕的oneliner,它获取一个json值,使用jq从中提取数据,然后使用xargs对数据进行迭代。最后,它应该会生成一些xml

legendary list installed--json{jq'.[].title'| sed s/“\”“/”/g | xargs-n1-p-d“\n”-I{}echo'{}”
首先,我没有在jq中使用
-r
标志,因为我认为问题可能来自它

预期输出应如下所示:

逃避现实者2 到目前为止,这是可行的(除了应用程序名称部分,因为这是它开始变得奇怪的地方)

因为我几乎无法在命令子项中使用jq进行调试,所以我想测试通过另一个命令子项将什么xargs传递到stdin。我将两个按钮元素之间的部分
{}
更改为
$(echo{})
,它仍然有效。但我无意中将它导入了
wc-w
,如果{}的内容实际上是两个,它就会输出一个!

它确实返回两个

使用
set-x运行的输出

❯ ./test.sh
+ echo '<layout>'
<layout>
+ legendary list-installed --json
+ jq '.[].title'
+ sed 's/"//g'
++ legendary list-installed --json
++ jq 'map(if .title == "{}" then .app_name elif .title == "_" then "_" else "_" end)'
++ echo '{}'
++ tee lolsu,txt
+ xargs -n1 -p -d '\n' -I '{}' echo 'button onclick="[' '"_",' '"_",' '"_"' ']">{}</button>'
echo 'button onclick="[' '"_",' '"_",' '"_"' ']">Ape Out</button>' ?...
❯ ./test.sh
+回声“
+已安装传奇列表--json
+jq.“[].标题”
+sed's/“//g”
++已安装传奇列表--json
++jq'map(if.title==“{}”然后.app_name elif.title==“{”然后“{”else”{”end)'
++回音“{}”
++蒂洛苏,txt
+xargs-n1-p-d'\n'-I'{}'echo'按钮onclick=“['''''''.','''''.''''.''''.''''.''''.''''.'''.''''.''''.'''''.''>{}”
echo'按钮点击“['''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''?。。。
似乎它没有被正确地替换。。。新的问题是如何使它在子条件内用真实的替换{}

TLDR: 计算xargs的值返回一个,而管道输入应该是两个单词(因为我在第行而不是单词上迭代) 在shell中运行时,当您编写时,它返回两个(不使用xargs、obv)

$(echo {} | wc -w)`
wc-w
命令的输入是字符串
{}
。这是一个单词,因此结果是
1
,它被替换为
$(echo{}wc-w)
。它没有从那里替换任何东西,因为命令替换首先执行,结果被替换到命令行中


因此,
xargs
接收的参数包含已替换的
1

$(echo{})
不起作用
{}
必须是
xargs
的参数,而不是在子shell中。这只是在呼应一个字面的
{}
@Barmar,它确实有效!似乎xargs自己实现了$()这个东西。演示:不清楚你到底在写什么。但是如果你只是把
$(echo{})
放在命令行中,那本质上与把
{}
放在命令行中是一样的,因为
$(…)
被替换为
..
的输出,例如do
echo$(echo{})
请在问题中显示命令行。很难从描述中分辨出发生了什么。但是为什么回显会在子项内部工作呢?它回显的是文本字符串
{}
。为什么它不能工作?请参阅新添加的文本。。。它回显了{}的真实且唯一的内容,这是一个类人猿,当你只有
$(回显{})
时,它就和写
{}
一样
xargs
然后将其作为参数接收,并将其替换为迭代的当前元素。我建议您编写一个shell脚本,将文本作为参数接收,并根据需要格式化,然后使用
xargs
调用该脚本。一气呵成会让你发疯的。
❯ ./test.sh
+ echo '<layout>'
<layout>
+ legendary list-installed --json
+ jq '.[].title'
+ sed 's/"//g'
++ legendary list-installed --json
++ jq 'map(if .title == "{}" then .app_name elif .title == "_" then "_" else "_" end)'
++ echo '{}'
++ tee lolsu,txt
+ xargs -n1 -p -d '\n' -I '{}' echo 'button onclick="[' '"_",' '"_",' '"_"' ']">{}</button>'
echo 'button onclick="[' '"_",' '"_",' '"_"' ']">Ape Out</button>' ?...
$(echo {} | wc -w)`