В вашем коде более одной проблемы, он, вероятно, будет также содержать специальные символы или пробелы в именах файлов, поскольку вы вообще не заключаете в кавычки.
Но вы правы в том, что exec рассматривает все как одну команду.
set val [exec [split $com " "] ]
не делает то, что вы ожидаете, split возвращает список, но не превращает этот список автоматически в дополнительные аргументы для exec.
Если вы используете Tcl 8.5, вы можете попробовать:
set val [exec {*}[split $com " "] ]
, который превращает список в отдельные аргументы для передачи в exec.
Но код, который вы используете, в целом хрупок, так как вы не обрабатываете какие-либо коды выхода или программы, пишущие в stderr, поэтому для обеспечения надежности потребуется более сложное решение.
Взгляните на http://wiki.tcl.tk/1039, особенно на обсуждения внизу страницы.