Что означает код выхода 1 из linux jq - PullRequest
1 голос
/ 02 августа 2020

Как говорится на плитке, мне интересно, когда jq завершает работу с кодом 1. В руководстве говорится, что -e устанавливает статус выхода jq равным 0, если последние выходные значения не были ни ложными, ни нулевыми, 1, если последнее выходное значение было либо ложным, либо нулевым. Непонятно, что подразумевается под последними выходными значениями false или null? что, если я не использую -e?

Ответы [ 2 ]

2 голосов
/ 02 августа 2020

Следующее предназначено для дополнения информации о параметре -e в другом месте на этой странице.

Предполагая, что -e НЕ было указано, код возврата:

  • 5, если вызов error/1 или halt_error/0 вызывает завершение программы
  • целое значение (*) в зависимости от N, если halt_error(N) вызывает завершение программы, где N - число; в частности, если N неотрицательно, то устанавливается статус (N% 256).

В противном случае, но при условии, что -e НЕ был указан, код возврата:

  • 2, если ошибка чтения входных данных вызывает завершение программы
  • 3 или 4, если синтаксическая ошибка в программе jq вызывает завершение программы
  • 0 при нормальном завершении.

(*) В частности:

N % 256 | if . < 0 then 256+. else . end

2 голосов
/ 02 августа 2020

Этот ответ основан на текущем исходном коде jq 1.6 из https://github.com/stedolan/jq

Для --exit-status (-e) существует 6 возможных кодов выхода:

  • 0: что-то выводит jq, и последняя строка не была ни ложной, ни нулевой
  • 1: вывод последней строки был ложным или нулевым
  • 2: проблема использования или системная ошибка
  • 3: ошибка компиляции программы jq
  • 4: jq вообще ничего не выводил
  • 5: неизвестная (неожиданная) ошибка: любая ошибка, кроме 2 и 3

Без --exit-status (-e), 0 означает, что jq запущен успешно. Кроме того, статусы выхода 1 и 4 исчезают, и вместо них возвращается 0.

Вот (Unix Bourne shell) несколько способов получить 1 в качестве значения выхода:

$ echo false | jq -e .
false
$ echo '{ "foo": false }' | jq -e .foo
false

$ echo null | jq -e .
null
$ echo '{ "foo": null }' | jq -e .foo
null
$ echo '{ }' | jq -e .foo
null
$ echo '{ "foo": false }' | jq -e '.bar?'
null

Вот как получить 4:

$ echo 'false' | jq -e '.foo?'

И (я уверен, вы хотите знать) вот один из способов получить 5:

$ echo false | jq .foo
jq: error (at <stdin>:1): Cannot index boolean with string "foo"
...