2012-06-18 3 views
0

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

bash-4.1$ a=file* 
bash-4.1$ ls $(echo $($(b=$a))) 

Я ожидаю, что вывод списка всех файлов имена, начинающиеся с «файл», но вместо этого он выводит список всех файлов в каталоге. Любая идея почему?

+0

пожалуйста, прочитайте: [баш документ] (http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions) – kev

ответ

2

Подстановка команды $(...) возвращает выход команды, пустой для присвоения. Таким образом, вы просто закончите работу ls.

+0

Означает ли это, что все 3 замены не могут быть показаны в одной строке? – SharkTiles

+0

Работает ли 'ls $ (echo" $ a ")'? (Обратите внимание, что есть две возможности для globbing, поэтому мне пришлось отключить один из них.) – Neil

+0

Я до сих пор получаю те же результаты :( – SharkTiles

1

Параметр и арифметическое расширение и подстановка команд оцениваются в одно и то же время, слева - самое внутреннее справа. Назначения, пустые и пустые расширения и перенаправления - все допустимые простые команды. Назначение теряется для подоболочки, а аргументы echo расширяются до нуля. echo выводит строку новой строки, но подстановка команд удаляет ее, а ls не получает аргументов. Кроме того, если вы ожидали, что a=file* сделать что-то большее, чем назначить литеральную строку, расширение пути не произойдет в назначениях.

См: http://wiki.bash-hackers.org/syntax/grammar/parser_exec

И вызов вопрос, когда вы понять все это. Какая будет стоимость x? (Показывает больше порядка расширения и некоторые небольшие Bash причуды.)

declare -i x=0 
x+=${x:-1} let x+=2 $((x+=4)) {x}<&$((x+=8,0)) 
Смежные вопросы