There's abstraction confusion here, though. All SQL injection countermeasures and all it would take to protect the above CLI call is respecting the actual language you're using. That is, not gluing a query/command from strings.
Starting a subprocess via shell is could in particular be solved by a simple API of the form of:
This assumes the --option=value syntax which while a de-facto standard on Unix-like systems is unfortunately not supported by all programs.
I agree that system() (in C and other langues that simply copied it) is a bad API. For shell escaping a command to start a process with a list of arguments would be enough, and even POSIX C has you covered there with vararg and array variants. [1]
Starting a subprocess via shell is could in particular be solved by a simple API of the form of:
in your favourite language. Handling pipes and redirects gets more complex, but I see no prima facie reason why it couldn't look like this: