LoginSignup
1
0

Bashで「Argument list too long」が発生した時の対策

Posted at

Bash のコマンドライン実行時に「Argument list too long」が発生した場合の対策です。

このエラーが発生する背景は2つあります。

  1. 引数が多すぎる (例: ファイルが大量にあるディレクトリで ls * とした時のワイルドカード展開が多い時)
  2. 引数が長すぎる (例: 一行の文字数が多い)

引数が多い場合の対策

先達が書かれているので、これらをご覧ください。
結論、xargs とかを使って引数を分割実行するといったことが書かれています。

引数が長すぎる場合の対策

引数が長すぎる場合は、ヒアドキュメントで標準入力から引き渡し、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

1
0
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
1
0