ksh расширяет $CMD
в первом примере как отдельный позиционный аргумент, значение которого равно «ls -ltr» (обратите внимание, что пробел включен. Вы хотите, чтобы он был расширен до двух аргументов: «ls» (имя команды) и "-ltr" (параметры). В последнем примере рассматривается это расширение, поскольку расширение находится в сценарии, а затем передается в вложенную оболочку.
Если вы писали программу на C, в первом примере вы получаете argc = 1
с argv[0] = "ls -ltr"
, а во втором - argc = 2
с argv[0] = "ls"
и argv[1] = "-ltr"
. (Если этот пример поможет.)