0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ubuntuのshとbashで環境変数内の改行記号\nの扱いが違う

Last updated at Posted at 2020-07-08

ホストからdockerコンテナに環境変数経由でjsonデータを渡し、echoとリダイレクトでファイル化してアプリから読み込もうとした。
結果、以下のエラーが発生。

Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value

原因は、jsonの中に入っていた環境変数\nを、shのcatでファイル化したこと。
shではなくbashにしたら解決した、という話。

shとbashの比較

ホストからコンテナに環境変数経由で\nが入ったjson文字列を渡し、echoで表示してみる。

bashの場合

$ docker run -e TEST="{ \"value\":\"hoge\nhuga\npiyo\" }" -it ubuntu /bin/bash
root@36d386fa2f27:/# echo ${TEST}
{ "value":"hoge\nhuga\npiyo" }

jsonとして正しいフォーマットを維持したままファイル化できる。

shの場合

$ docker run -e TEST="{ \"value\":\"hoge\nhuga\npiyo\" }" -it ubuntu /bin/sh
# echo ${TEST}
{ "value":"hoge
huga
piyo" }

このままリダイレクトしてファイル化し、アプリを読み込むと、不適切な改行でエラーになる。

bashからshに切り替えても同じように壊れてしまうので、shは取り出すときに\nをエスケープしてくれない様子。

$ docker run -e TEST="{ \"value\":\"hoge\nhuga\npiyo\" }" -it ubuntu /bin/bash
root@3dd58b596f66:/# echo ${TEST}
{ "value":"hoge\nhuga\npiyo" }
root@3dd58b596f66:/# /bin/sh
# echo ${TEST}
{ "value":"hoge
huga
piyo" }

ちなみにCentOSの場合

$ docker run -e TEST="{ \"value\":\"hoge\nhuga\npiyo\" }" -it centos /bin/sh
sh-4.4# echo ${TEST}
{ "value":"hoge\nhuga\npiyo" }

CentOSであれば、shでも特に問題なくjsonが復元できる。
他にも、Debian系であってもイメージによっては普通に動いた。

変なところでハマってしまった。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?