0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Bashのコマンド置換+ヒアドキュメントで「warning: command substitution: 1 unterminated here-document」が発生した時の対策

Posted at

Bash でコマンド置換+ヒアドキュメントを使った際に「warning: command substitution: 1 unterminated here-document」が発生した場合の対策です。

この警告は、ヒアドキュメント全体もコマンド置換内(のサブシェル内)に記述することで回避できます。

VAL1="Any Value"
RESULT=$(cat << _EndOfJson_
{
  "foobar1": "${VAL1}"
}
_EndOfJson_
)
echo "$RESULT"
#=> {
#=>   "foobar1": "Any Value"
#=> }
catとパイプを使う場合
VAL1="Any Value"
RESULT=$(cat << _EndOfJson_
{
  "foobar1": "${VAL1}"
}
_EndOfJson_
)
#=> {
#=>   "foobar1": "Any Value"
#=> }

解説

やりがちなのが以下のような記述です。

warningが発生する例
VAL1="Any Value"
RESULT=$(cat << _EndOfJson_)
{
  "foobar1": "${VAL1}"
}
_EndOfJson_
#=> warning: command substitution: 1 unterminated here-document が発生
# ちなみに、コマンド自体はなんとなく実行される

ほとんど似ていますが、コマンド置換 $() のカッコの位置が異なることがポイントです。

$(cat << _EndOfJson_) は、サブシェル(子プロセス)で実行されます。しかし、このカッコ内 _EndOfJson_ という終端行がありません。これが warning の発生理由です。

こういったこともあり、手で1行づつ入力すると $(cat << _EndOfJson_) という行の時点で warning が発生します。
※ しかし、warning が出てもなんとなく動いちゃう(理由は追ってない)ので、困りもの...

対策の方は、$RESULT 視点では RESULT=$(...) となっており、$(...) 内にヒアドキュメントの終端が含まれているため、警告が出ないのです。

あとがき

GPT-4o モデルに curl コマンドで画像をプロンプトとして送信する方法を書いてたら、ほとんどシェル芸の話だったことに気が付いたので、分割しました。

EoT

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?