2015-01-23 4 views
0

У меня возникли трудности с попыткой передать параметр bash в find в качестве аргументов.Расширение параметра bash в качестве аргументов команды

Лучший объяснил с помощью кода:

$ echo $BASH_VERSION 
4.1.2(1)-release 

$ find /etc -path '*/init.d' 2>/dev/null | wc -l 
2 

$ args="-path '*/init.d'" 
$ echo $args 
-path '*/init.d' 
$ find /etc $args 2>/dev/null | wc -l 
0 

$ set -x; !! 
set -x; find /etc $args 2>/dev/null | wc -l 
+ wc -l 
+ find /etc -path ''\''*/init.d'\''' 
0 

Где дополнительные '' котировки, поступающие из в set -x выходе?

Я пробовал несколько различных способов заставить это работать, но пока не добился успеха. Это руководство, кажется, указывает, что это должно быть возможным, так как расширение параметра происходит перед выполнением команды: http://stuff.lhunath.com/parser.png

+0

Диаграмма, на которую вы ссылаетесь, хороша, inasfar, поскольку она идет, но даже ее автор описывает это как объяснение _simplified_. См. Http://mywiki.wooledge.org/BashParser для чего-то с меньшим количеством деталей. –

+0

Это то, что 'set -x' печатает с одинарными кавычками. –

ответ

3

использовать массив:

args=(-path '*/init.d') 
find /etc "${args[@]}" 

Причина другой подход не работает подробно обсуждается в BashFAQ #50. Короче говоря, символы котировки обрабатываются во время синтаксического разбора - до происходит расширение параметра. Таким образом, когда символы котировки выходят от, они не анализируются как синтаксис, а обрабатываются как любые другие данные: выполняйте разделение строк и расширений glob и передавайте их в исполняемую программу.

Дополнительные кавычки/экранирование в set -x вывод - это то, как оболочка сообщает вам, что ваши первичные кавычки являются данными, отличая их от кавычек, которые присутствуют в качестве синтаксиса.

+0

Это работает, спасибо! Я попытался использовать массив, но сохранил его как строку, например: 'args = (" - path '*/init.d' ")'. Полагаю, это не по тем же причинам. – Nick

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