ошибка jq, сообщение об использовании при конвейерной передаче

Чтобы уточнить вашу xargsпопытку

xargs -L1 sh -c 'f="${0##*/}"; printf "%s\n" "$0" > "${f%.*}.strm"' < file

Первая замена f="${0##*/}"удаляет компоненты пути URL, а вторая "${f%.*}.strm"удаляет и заменяет расширение.

Пр.

$ xargs -L1 sh -c 'f=${0##*/}; printf "%s\n" "$0" > "${f%.*}.strm"' < file
$ head *.strm
==> file_name1.strm <==
http://domain.com/file_name1.mkv

==> file_name2.strm <==
http://domain.com/file_name2.mkv

==> file_name3.strm <==
http://domain.com/file_name3.mkv
1
07.04.2021, 14:36
1 ответ

Действительно, комментарий @glenn -jackman является правильным ответом для вашего первого примера , но я был уверен, что это приведет к вопросу о том, почему это сработало, когда вы catэто, и... получилось! Технически это отдельный вопрос, но это, честно говоря, логическая часть объяснения , почему ваша первоначальная попытка не сработала, ИМХО.

И, честно говоря, я написал большую часть этого ответа, прежде чем понял, что я, как и все остальные в комментариях, игнорирую cat dada1.json | jq | head, et. др. недостатки.

Итак, начнем с ответа на первый пример:

Когда вы вызываете как jq dada1.json, первый не -аргумент флага (, а не -, начинающийся с -), анализируется как фильтр, как указал @glenn -jackman в комментарии.. jqдумает, что ваше имя файла является фильтром. Это должно быть очевидно из синопсиса справочной страницы, упомянутого в комментариях.

И да, как вы обнаружили, правильный вызов в этом случае jq '.' dada1.json, чтобы он сначала анализировал фильтр, а затем необязательные имена файлов в конце строки команды -.

Так что же происходит, когда вы catэто (т. е. передаете это )? Насколько я могу судить, это на самом деле не задокументировано в help/man, но этот фрагмент jqкода вступает в игру:

 if (!program && (!isatty(STDOUT_FILENO) || !isatty(STDIN_FILENO)))
    program = ".";

Что, насколько я могу судить, назначает по умолчанию «программу» (, то есть «фильтр» ), если:

  • Нет существующего фильтра, проанализированного из списка аргументов
  • Либо STDIN, либо STDOUT являются каналом

Таким образом, это в основном делает «интеллектуальный запасной вариант», чтобы разрешить вызов только с помощью | jq.

Что касается остальных примеров, где вы перенаправляете вывод и это не удается, это работает для меня (и других в комментариях )в jqверсии 1.6 (. и позднее ).В более ранних версиях была проблема с перенаправлением (благодаря @fra -san в комментариях напрасно это ). Мы предполагаем, что вы используете более старую версию.

. на 1,6:

> cat dada1.json | jq | head
{
  "output": "somethingsomething"
}
> cat dada1.json |jq > dada2.txt
> cat dada2.txt
{
  "output": "somethingsomething"
}
> rm dada2.txt
> cat dada1.json |jq |tee -a dada2.txt
{
  "output": "somethingsomething"
}
> cat dada2.txt
{
  "output": "somethingsomething"
}
2
28.04.2021, 22:53

Теги

Похожие вопросы