Linux Tips : $マークには気をつけろ

こんなことは熟練プログラマには当たり前のことかもしれませんが、ちょっとはまってしまったのでメモしておきます。

やりたかったこと

簡単にいうと、こういうことがやりたかったわけです。

Dir.glob("#{@dir}*").each do |path|
  if system("sendmail -t < #{path}")
    File.delete(path)
  end
end

ディレクトリを読んで、そこにあるファイルを1つずつ sendmail に渡して送ってもらう。ただ、それだけです。
特に悪いような気はしませんし、実際これである程度動いていたわけです。ところがあるとき、いっこうに送られないファイルがでてきてしまいました。それはこんなファイルでした。

004901c908ac$5b8f60d0$1b50280a

これが送れないんです。手で直接やっても同じくエラーになります。

$ sendmail -t < 004901c908ac$5b8f60d0$1b50280a
bash: 004901c908acb8f60d0b50280a: No such file or directory

こう(↓)すると大丈夫でピーンときました。

$ sendmail -t < 004901c908ac\$5b8f60d0\$1b50280a

で、解決策は?

Dir.glob("#{@dir}*").each do |path|
  if system("sendmail -t < '#{path}'")
    File.delete(path)
  end
end

ファイル名の前後にシングルクォートを付けるだけです。
ダブルクォートは、ダラー('$')、バッククォート(`)、バックスラッシュ(\)を特殊文字として認識するので、ダラーそのままにしたいならバックスラッシュでエスケープするか、シングルクォートでくくれということです。
わかってしまうとなんでもないことですが、つい忘れがちなのでメモしておきます。