カールをjqにパイプするこのコマンドにはどのような問題がありますか?

カールをjqにパイプするこのコマンドにはどのような問題がありますか?

関連がある場合は、BSD用に作成されたbashスクリプトをLinuxで実行しようとします。今私は次の行にぶら下がっています。

json="$(sudo -u "${vpnUser}" -- curl --interface "${adaptorName}" --get --insecure --silent --show-error --fail --location --max-time "${curlMaxTime}" --data-urlencode "token=${authToken}" "https://${gatewayAddress}:19999/getSignature" | jq -Mre)"

スクリプトの変数値をエコーし​​ましたが、よさそうです。その後、変数を値に置き換えました。それからjqは構文エラー(通常の出力)について文句を言うようですUsage:、私の考えではカールが(23) Failed writing body。コマンドを実行すると、sudo -u ... | jq -MreJSONファイルのように見える内容が印刷されます。

ベストアンサー1

問題はjq1.6より前のバージョンではフィルターランニング。最も単純なフィルタは、入力と同じ出力を生成するIDフィルタです。これはから単一点として作成されますjq

コードを機能させるには:

json=$( ... | jq -r -e . )

一緒に使用するオプションは次のとおりですjq

  • このオプションは、無色の出力が要求されることを除いてと同じ-Mです。--monochrome-outputこれはjq端末に書き込まないときのデフォルト値なので、このオプションは削除される可能性が高いです。

  • この-rオプションはと同じです--raw-outputjq出力時一行(文字列を含むJSON構造ではありません)文字列がデコードされます。これは、出力文字列が引用されず、拡張など\nの特殊文字シーケンスを含むことを意味します。このオプションは\t\"いいえ入力がjqデコードする必要があるJSONエンコーディング文字列のセットである場合、これは削除されます。

  • この-eオプションはと同じです--exit-status。このオプションを使用すると、jq終了の終了状態が最後に評価された値を反映します。これは、コマンドが次のように終了することを意味します。失敗する最終結果がnullまたはfalse。シェルオプションが有効な状態でスクリプトがerrexit実行されると、ここではゼロ以外の終了状態のためにjqスクリプトが終了します。つまり、コマンドが発生するスクリプトについて詳しく知らない限り、このオプションを削除することはできません。

jq私はここで使用するだけでcurl結果をきれいに印刷していると思います。原作者が実際には考えずにどこかでこれらの3つのオプションをコピーした可能性がありますが(含まれている項目でこれがわかります)、スクリプトを終了するために終了ステータスに依存している可能性が-Mあります。jq

おすすめ記事