$()
запускает вложенную команду в подоболочке и возвращает ее вывод. Ваши первые два примера пытаются запустить команду "ls -ltr"
. Поскольку вы указали всю команду в кавычках, оболочка будет искать команду с полным именем ls -ltr
, а не с именем ls
, которому передаются параметры -ltr
. Третий пример запускает команду ls
с аргументом -ltr
, и X получает выходные данные этой команды. Поскольку $()
был заключен в двойные кавычки, разделение полей и расширение пути не выполняются.
Пример разницы:
$ ls
bin
$ echo $(echo 'b*')
bin
$ echo "$(echo 'b*')"
b*
См. Также спецификацию SUS для расширения команд.