jq ではハイフンに意味がある
オブジェクトのキー名にハイフンが混じるとエラー
$ cat out | jq - .download-dir jq: error: dir/0 is not defined at <top-level>, line 1:
なぜ?
だってJSってハイフンは引き算じゃん?
こう書いてしまうと、
obj.config ={".download-dir": "~/Downloads"} obj.config.download-dir # あ!?
どう考えても、引き算じゃん?
obj.config.download-dir (obj.config.download - dir) // え?
なので、JSONにハイフンの引数を入れるのはあまり推奨されないけど、JSONを単なるシリアライズだとか、データ保存形式とか、設定ファイルだと思ってる方々はついついやりがちなのです。
jq ではクォートか、ハッシュアクセスを使う
jq でも同じです。ちゃんとクォートつけるか、「 [] 」 でアクセスする
# cat out | jq -ra '."download-dir"' ~/Downloads root@acid:~# cat out | jq -ra '.["download-dir"]' ~/Downloads
だめな例
おかしがちなだめな例。
これは、ダブルクォーテーションマークが、Bashに解釈されるときに外されて jq まで届かない。
# cat out | jq -ra ."download-dir"
これは、jq がシェル経由という落としな穴。
JSON は意外な落としな穴がある。
何でもかんでもJSONってやめたほうが良いよまじで。手入力とか設定ファイルにはホント向いてないから。
手作業に向いてないってことはデバッグとかで、データ取り出しが本当に煩雑。