`!` が残ってますね。
あとはここにも `shellescape()` があった方がいいように思うけど、動作確認とかも考えると別の人が別 Issue でやった方がいいかな。