Here Documents on Bourne/Ash Shell (not bash)
スクリプトを
bash シェル
でなくsh シェル
(Bourne shell, ボーンシェル)互換で書くと、たいていの Linux ディストーションで動くと聞いた。
shシェル
で**ヒアドキュメントを使って複数行を変数に代入できるか**知りたい。
TL;DR
ヒアドキュメントの変数代入は
sh
シェルでも動きます。System7 の頃からできるんです。
VAR=$(cat <<HEREDOC
one
two
three
HEREDOC
)
$ echo $SHELL
/bin/bash
$ # sh シェルで実行させる
$ /bin/sh <(cat sample_script.sh)
- オンラインで動作をみる @ paiza.IO
- 参考文献: 「機能と特徴」| Bourne Shell @ Wikipedia
Qiita 記事を「shシェル
複数行
変数
代入
ヒアドキュメント
」とググっても bash
シェルばかり。タイトルからわかる sh
シェルの場合の記事がすぐに出てこなかったので自分のググラビリティとして。
TS;DR
Docker イメージ内で使うシェルスクリプトを組むとき、alpine
などは ash
の sh
系シェルであるため bash
のシェルスクリプトだと動かないことが、まれに多くあります。
まぁ、「やってみろ」って話しなんですが、、、Mac のように sh
のつもりが実は bash
のエイリアスになっていたりするので、確信が持てなかったのです。そもそも bash
の場合でも構文を忘れてしまうし。。。
そこで、Docker のイメージでもシンプルで基本的な alpine
や busybox
(ash
シェル) のベースイメージで動作するか試してみました。
$ # スクリプトの中身
$ cat ./sample_heredoc.sh
# /bin/sh
VAR=$(cat <<'HEREDOC'
abc'asdf"
$(dont-execute-this)
foo"bar"''
HEREDOC
)
echo "$VAR"
$ # busybox で実行
$ docker run --rm -v $(pwd)/sample_heredoc.sh:/sample.sh busybox /sample.sh
one
two
three
$ # Alpine Linux で実行
$ docker run --rm -v $(pwd)/sample_heredoc.sh:/sample.sh alpine /sample.sh
one
two
three
しかし、「そもそも System7 時代からヒアドキュメント使えるよ」と Bourne Shell の Wikipedia に載ってました。。。あちょんぶりけ
UNIX Version 7 での Bourne Shell の機能と特徴を以下に挙げる:
- ...
<<
を使ったヒアドキュメント(Here documents
)機能。スクリプト内に埋め込まれたテキストブロックを入力として使う。- ...
(「機能と特徴」| Bourne Shell @ Wikipedia より)