Итак, у меня есть ужасный oneliner, который получает значение json, извлекает из него данные с помощью jq, а затем перебирает данные с помощью xargs. В конце он должен создать некоторый xml
legendary list-installed --json | jq '.[].title' | sed s/"\""/""/g | xargs -n1 -p -d "\n" -I {} echo '<button onclick="'$(legendary list-installed --json | jq 'map(if .title == "'{}'" then .app_name elif .title == "_" then "_" else "_" end)')'">'{}'</button>'
Прежде всего, я не использовал флаг -r
с jq, потому что думал, что проблема может быть из-за него.
Ожидаемый результат должен быть примерно таким:
<button onclick=app name e.g. Coley> The Escapist 2 </button>
Пока что это работает (за исключением части имени приложения, так как именно здесь она начинает становиться странной)
Поскольку я вряд ли могу отлаживать с помощью jq внутри подстановки команд, я хотел проверить, какие xargs передаются в стандартный ввод через другую подстановку команд. Я изменил часть между двумя элементами кнопки {}
на $(echo {})
, которая все еще работает. Но случайно я передал его в wc -w
, который выводит ОДИН, если содержимое {} на самом деле ДВА! а>
❯ ./test.sh
<layout>
echo 'button onclick="[' '"_",' '"_",' '"_"' ']">Ape Out</button>' ?...^C⏎
> cat test.sh
...'$(echo {})'</button>'
Если я просто повторю содержимое {}, он вернет это (я знаю, что это бесполезное эхо, это просто для согласованности): Когда я считаю слова внутри своей оболочки, а не внутри xargs
legendary list-installed --json | jq '.[].title' | head -n 1 | sed s/"\""/""/g | 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>' ?...
Похоже, что он не заменяется правильно... Новая проблема заключается в том, как заставить его заменить {} реальным внутри подстановки.
TLDR: подсчет значения xargs возвращает единицу, в то время как передаваемый ввод должен состоять из двух слов (поскольку я повторяю строку, а не слово). При работе в оболочке он возвращает два (без использования xargs, obv)
$(echo {})
не сработает.{}
должен быть аргументомxargs
, а не в подоболочке. Это просто повторение буквального{}
- person Barmar   schedule 18.10.2020$(echo {})
в командную строку, это по сути то же самое, что просто ввести{}
в командную строку, поскольку$(...)
заменяется выводом...
. - person Barmar   schedule 18.10.2020wc -w
, там написано, что это только одно слово, тогда как явно 2 i.imgur.com/M50ThTY.png - person lolsu   schedule 18.10.2020