`jq`でデバッグする方法

`debug`関数を使うときのヒントを紹介します。


jqには便利なdebugフィルターが用意されています。演習の解答を書いているときにこれを使うと、その時点でjqのパイプラインにあるデータを調べられます。

debugは「デバッグ配列」をstderrに出力します。入力はそのまま出力されます。配列の最初の要素は文字列"DEBUG:"です。2番目の要素は、debugの呼び出し方によって変わります。

  1. 引数を取らないdebug関数は、入力のコンパクトな表現をデバッグ配列に入れます:

    jq -n '[11, 22, 33] | debug | map(. * 2)'
    

    次のように出力されます

     ["DEBUG:",[11,22,33]]
     [
       22,
       44,
       66
     ]
    
  2. 引数を1つ取るバージョンは、入力を与えられたフィルターに通します:

    jq -n '[11, 22, 33] | debug("length: \(length), last: \(.[-1])") | map(. * 2)'
    
     ["DEBUG:","length: 3, last: 33"]
     [
       22,
       44,
       66
     ]
    

    フィルターは文字列である必要はありません。どんなものでも渡せます。カンマで区切った複数の式を渡して「複数行」のデバッグ出力にすることもできます:

    jq -n '[11, 22, 33] as $a | 44 | debug("I am here:", $a, .)'
    
    ["DEBUG:","I am here:"]
    ["DEBUG:",[11,22,33]]
    ["DEBUG:",44]
    44