Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2884

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

$
0
0

ホストから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 -eTEST="{ \"value\":\"hoge\nhuga\npiyo\" }"-it ubuntu /bin/bash
root@36d386fa2f27:/# echo${TEST}{"value":"hoge\nhuga\npiyo"}

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

shの場合

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

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

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

$ docker run -eTEST="{ \"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 -eTEST="{ \"value\":\"hoge\nhuga\npiyo\" }"-it centos /bin/sh
sh-4.4# echo${TEST}{"value":"hoge\nhuga\npiyo"}

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

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


Viewing all articles
Browse latest Browse all 2884

Trending Articles