[シェルスクリプト] めちゃめちゃ気づきにくいバックスラッシュによるバグ

実験してみる

これは良く考えると当たり前で、実験してみるとわかります。
/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"となりました。

つまり、冒頭のシェルスクリプトはこれををやってしまっていたのですね。

まとめ

  • シェルスクリプトのバックスラッシュを甘く見るな
  • エスケープのバグは気づきにくい
  • エスケープしなくてよいならするな
カテゴリ: