2010-05-04 9 views
0

Я изучаю ksh, я пытаюсь запустить команду с помощью подоболочки, но у меня разные результаты, я угадываю причину.ksh одинарные кавычки и двойные кавычки

[email protected][/home/za] X=$("ls -ltr") 
ksh: ls -ltr: not found. 
[email protected][/home/za] X=$('ls -ltr') 
ksh: ls -ltr: not found. 
[email protected][/home/za] X="$(ls -ltr)" 
[email protected][/home/za] echo $X 
total 5256 -rw- 

благодаря

ответ

3

$() запускает прилагаемую команду в подоболочке и возвращает ее выход. Первые два примера пытаются запустить команду "ls -ltr". Поскольку вы указали всю команду, оболочка будет искать команду с полным именем ls -ltr, а не с именем ls и передается опциями -ltr. В третьем примере выполняется команда ls с аргументом -ltr, а X получает выход этой команды. Поскольку $() был заключен в двойные кавычки, разбиение поля и расширение пути не выполняются.

Пример разницы:

$ ls 
bin 
$ echo $(echo 'b*') 
bin 
$ echo "$(echo 'b*')" 
b* 

Смотрите также SUS specification для расширения команды.

+0

Спасибо за объяснение – jhon

+0

+1 для примера – Gillfish

-2

Это, вероятно, не наследуют среду. Если путь не установлен, то он не может найти программу ls

+0

Эта проблема не имеет ничего общего с окружающей средой или путем. Ответ jamessan правилен тем, что он имеет все, что связано с правилами цитирования, расширением параметров и подстановкой команд. – jabbie

Смежные вопросы