Передача аргумента Bash -c для поиска - PullRequest
0 голосов
/ 16 января 2019

Эта команда работает

find . -name \*.txt -print

и выводит два имени файла

Эта команда работает

bash -c 'echo . $0 $1 -print' "-name" "\*.txt"

и выводит этот результат:

. -name * .txt -print

Но эта команда

bash -c 'find . $0 $1 -print' "-name" "\*.txt"

не выдает ошибку, но и ничего не выводит.

Может кто-нибудь сказать мне, что здесь происходит?

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Похоже, вы пытаетесь использовать "\*.txt", чтобы предотвратить глобальное расширение, так что команда find видит *.txt вместо, например. foo.txt.

Однако, в конечном итоге он видит \*.txt. Нет файлов, соответствующих этому шаблону, поэтому вы не видите выходных данных.

Чтобы сделать find см. *.txt в качестве третьего аргумента, вы можете сделать это:

bash -c 'find . $0 "$1" -print' "-name" "*.txt"

Редактировать: Вы действительно получаете . -name *.txt -print как вывод первой команды, в которой вы заменили find на echo? Когда я запускаю эту команду, я получаю . -name \*.txt -print.

0 голосов
/ 16 января 2019

Ну, предложения от работы Франческо. Но я все еще смущен поведением здесь. Мы знаем, что использование символов без кавычек в команде поиска обычно приводит к ошибке. Для остроумия:

find . -name *.txt -print

find: пути должны предшествовать выражению: HowTo-Word-Split.txt' find: possible unquoted pattern after predicate -name '?

Однако помещение символа подстановки в одинарные кавычки (или экранирование, если оно содержит только 1 символ) будет работать так:

find . -name \*.txt -print

, который дает этот вывод (на две отдельные строки)

> ./HowTo-Word-Split.txt    
> ./bash-parms.txt    

Итак, в версии bash -c я думал следующее:

bash -c 'find . $0 $1 -print' "-name" "*.txt"

приведет к расширению * .txt даже перед передачей в строку cmd, и использование одинарных кавычек приведет к попытке выполнения (после подстановки аргумента arg и эффекта -c)

find . -name *.txt -print

, который, как я только что продемонстрировал, не работает.

Однако, похоже, что с ключом -c связана какая-то магия, о чем свидетельствует установка -x в приглашении bash, например:

$ set -x
$ bash -c ' find . $0 "$1" -print' "-name" "*.txt"

+ bash -c ' find . $0 "$1" -print' -name '*.txt'
./HowTo-Word-Split.txt
./bash-parms.txt

Обратите внимание, что хотя я использовал двойные кавычки в строке -c, bash фактически выполнил поиск с одинарными кавычками, заключенными в аргумент, что заставило поиск работать.

Проблема решена. :)

0 голосов
/ 16 января 2019

Я думаю, вы должны использовать следующее:

bash -c 'find . $0 "$1" -print' "-name" '*.txt'

Чтобы проверить, что именно будет выполнено, вы можете сделать:

bash -c 'echo find . $0 "$1" -print' "-name" '*.txt'

Выход:

find . -name *.txt -print
...