Aha, the <()
format for named pipes is a feature of bash, not unix or sh. So in order to use this feature, the command must be interpreted by bash, and thus my code must be converted to:
[1] pry(main)> a = "bash -c 'cat <(echo foo) <(cat file) <(echo bar)' | less"
=> "bash -c 'cat <(echo foo) <(cat file) <(echo bar)' | less"
[2] pry(main)> `#{a}`
=> "foo\nfile contents\nbar\n"