0xf

日記だよ

jq でシェルスクリプトは書けない...というのは悔しい

こういうコードは書けない。

#!/usr/bin/env jq
{"hello":"world"}

なぜなら jq は渡されたファイルの1行目を無視するようなオプションがないからです。json#始まりのコメントを許容するようになる未来はあんまり想像がつかない。

無理やりやろうとするなら、jq は標準入力からデータを受け取れるので、最初の行を削除してファイルの内容を標準出力に書き出し受け取ったコマンドにパイプする簡単なコードを挟んで、

#!/usr/bin/env bash
# drop_first_line.sh 
command=${1}
file=${2}

sed -e 1d $file | $command

こんなふうにするといいのではないか*1

#!/usr/bin/env drop_first_line.sh jq
{"hello":"world"}

それでこうなるわけですよ。

% ./hello.jq                    
{
  "hello": "world"
}

便利!!!

...かな?

*1:envを挟むとシェルスクリプトをランタイムに指定できる別のハックが行われている。シェバン行で指定できるのは実行バイナリである必要があり、シェルスクリプトは指定できないのだが、envコマンドは実行バイナリである。