bashでヒアドキュメントを使ってファイルに書き出す際、変数をそのまま記述すると現在の環境変数を元に展開されてしまう。

blacknon@BS-PUB-UBUNTU-01:~$ env | grep SHELL
SHELL=/bin/bash
blacknon@BS-PUB-UBUNTU-01:~$ cat << EOF > ./test
> SHELL=99999
> TEST=1234
> VAL=$SHELL
> AAA=$TEST
> EOF
blacknon@BS-PUB-UBUNTU-01:~$ cat ./test
SHELL=99999
TEST=1234
VAL=/bin/bash
AAA=

これを展開させないようにするには、catでヒアドキュメントとして指定している文字列(今回の例の場合だとEOF)をダブルクォーテーションかシングルクォーテーションで囲ってやればよい。

blacknon@BS-PUB-UBUNTU-01:~$ cat << "EOF" > ./test
> SHELL=99999
> TEST=1234
> VAL=$SHELL
> AAA=$TEST
> EOF
blacknon@BS-PUB-UBUNTU-01:~$ cat ./test
SHELL=99999
TEST=1234
VAL=$SHELL
AAA=$TEST

sudoで書き出しをする際は、囲む際にエスケープするか違うクォーテーションを使ってやろう。

blacknon@BS-PUB-UBUNTU-01:~$ sudo sh -c 'cat << "EOF" > /test
SHELL=99999
TEST=1234
VAL=$SHELL
AAA=$TEST
EOF'
blacknon@BS-PUB-UBUNTU-01:~$ ls -la /test
-rw-r--r-- 1 root root 43  8月 21 10:56 /test
blacknon@BS-PUB-UBUNTU-01:~$ cat /test
SHELL=99999
TEST=1234
VAL=$SHELL
AAA=$TEST