[シェルスクリプト] めちゃめちゃ気づきにくいバックスラッシュによるバグ
実験してみる
これは良く考えると当たり前で、実験してみるとわかります。/etc/init.d/hoged
#!/bin/sh
OPTS=" -foo \"bar\" "
CMD=" /tmp/show_args.sh $OPTS"
$CMD
/tmp/show_args.sh (デーモンのかわり)
#!/bin/sh
echo $@
実行すると、
/etc/init.d/hoged
foo "bar"
ダブルクォートがそのまま表示されてしまっています。実験その2
/tmp/show_args.sh foo "bar"
foo bar
これは期待どおりに動いてくれます。一方、
/tmp/show_args.sh foo \"bar\"
foo "bar"
おお、"bar"となりました。つまり、冒頭のシェルスクリプトはこれををやってしまっていたのですね。
まとめ
- シェルスクリプトのバックスラッシュを甘く見るな
- エスケープのバグは気づきにくい
- エスケープしなくてよいならするな