6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

jqコマンドのargでタイムスタンプをvalueにしたら空で返ってきた

Posted at

結論

jqの1.6以前では、jqコマンドの--argのvalueに20バイト以上のASCII文字列を渡すと空になるバグがあった(1.7では改善済み)です。

jqコマンドとは

https://jqlang.org/ によると、

jq is like sed for JSON data - you can use it to slice and filter and map and transform structured data with the same ease that sed, awk, grep and friends let you play with text.

とのことで、要約するとJSON データ用のsedのようなものとのことです。
jqコマンドについては、@takeshinoda@githubさんの記事に詳しく記載されていますので、ぜひご覧ください。

沼った経緯

以前執筆した記事の続きで、CodeBuildでメンテナンスの時刻を返すためにjqを使ってbashを実行するようにしていました。しかし、下記の実行環境だとjq --arg start "$MAINTENANCE_START" --arg end "$MAINTENANCE_END"の部分がうまく変換されず、中身が空になってしまっていました。

<失敗時の環境>
・オペレーティングシステム:Ubuntu
・ランタイム:Standard
・イメージ:aws/codebuild/standard:5.0(6.0/7.0も同様)

反対に以下の環境だと、jqが期待通りの値に変換され、実行環境が問題なのかと頭を悩ませていました。

<成功時の環境>
・オペレーティングシステム:Amazon Linux
・ランタイム:Standard
・イメージ:x86_674-standard:5.0

調査結果

調査を進めるとOSやイメージが原因ではなく、jqの1.6か1.7かで挙動が変わっていました。
具体的には、失敗していた環境ではjq1.6を使用しており、成功した環境ではjq1.7を使用していました。
コミットを以下で確認したところ、NUL終端を誤認して文字列の長さを0と見なすバグが修正されているようでした。

おわりに

なかなか同じ事象にあっている方は少ないと思われますが、もし同じ事象にあっている方はjq1.7以降を利用することをおすすめします。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?