Bash のコマンドライン実行時に「Argument list too long」が発生した場合の対策です。
このエラーが発生する背景は2つあります。
- 引数が多すぎる (例: ファイルが大量にあるディレクトリで
ls *
とした時のワイルドカード展開が多い時) - 引数が長すぎる (例: 一行の文字数が多い)
引数が多い場合の対策
先達が書かれているので、これらをご覧ください。
結論、xargs とかを使って引数を分割実行するといったことが書かれています。
- chmod や mv すると "bash: Argument list too long" が出るようになった
- linuxのコマンドラインでargument list too longエラーが出た時の対処方法
引数が長すぎる場合の対策
引数が長すぎる場合は、ヒアドキュメントで標準入力から引き渡し、curl 側ではファイルからの入力として扱うことで回避できます。
# ほかのオプションは省略しています
curl -d @- << _EndOfPostBody_
{
"image_url": "${DATA_URI}"
}
_EndOfPostBody_
# もしくは
cat << _EndOfPostBody_ | curl -d @-
{
"image_url": "${DATA_URI}"
}
_EndOfPostBody_
2つの方法があります。
どちらでもよいのですが、個人的にはcatの後にパイプで加工できたりするので2番目が好きです。ただ、Syntax Highlightは1番目のほうが素直なんですよね、悩む。
解説
例えば画像をBase64エンコーディングしてData URIにした時に、画像サイズが大きいと発生しがちです。例として curl を考えてみます。
curl の -d
の引数に直接 Data URI(画像のBase64エンコード済み文字列) を書いた場合、大抵 Argument list too long
が発生する事でしょう。例えば以下のようにした場合です。
# ほかのオプションは省略しています
DATA_URI='data:image/jpeg;base64,'$(base64 -w0 INPUT.jpg)
curl -d '{"image_url": "${DATA_URI}"}'
#=> -bash: /usr/bin/curl: Argument list too long
あとがき
GPT-4o モデルに curl コマンドで画像をプロンプトとして送信する方法を書いてたら、ほとんどシェル芸の話だったことに気が付いたので、分割しました。
EoT