escapeShellCommand, escapeWindowsArgument, escapeShellFileName - in which way differ and why it's not one function? Why escapeWindowsArgument exists without posix counterpart?