In sh:

~$ `echo ls`
bin/  Desktop/

But in fish:

fish: Illegal command name “(echo ls)”
~% (echo ls)

(Note that the error message appears above the command line.)

~% echo (echo ls)
ls
~% eval (echo ls)
bin/  Desktop/

fish: Illegal command name “(echo ls)”
exec (echo ls)
     ^
~% exec (echo ls)

It seems that command substitution only works as parameters of a command, not as a command itself? Why?

Well, the help doc does say

If a parameter contains a set of parenthesis, the text enclosed by the parenthesis will be interpreted as a list of commands.

But still, why?

Edit
Report