Эта команда работает
find . -name \*.txt -print
и выводит два имени файла
Эта команда работает
bash -c 'echo . $0 $1 -print' "-name" "\*.txt"
и выводит этот результат:
. -name *.txt -print
Но эта команда
bash -c 'find . $0 $1 -print' "-name" "\*.txt"
не выдает ошибки, но и ничего не выводит.
Кто-нибудь может сказать мне, что здесь происходит?
Итак, проблема, которую я вижу, заключается в том, что использование bash -c дает процессору bash две возможности для расширения *.txt. Я не уверен, что это за исправление
Взгляните на: Что мне делать, если кто-то ответит на мой вопрос?





Похоже, вы пытаетесь использовать "\*.txt" для предотвращения расширения glob, чтобы команда find увидела *.txt вместо, например, foo.txt.
Однако в итоге он видит \*.txt. Ни один файл не соответствует этому шаблону, поэтому вы не увидите никакого вывода.
Чтобы find видел *.txt в качестве третьего аргумента, вы можете сделать это:
bash -c 'find . $0 "$1" -print' "-name" "*.txt"
Обновлено: вы действительно получаете . -name *.txt -print как результат первой команды, в которой вы заменили find на echo? Когда я запускаю эту команду, я получаю . -name \*.txt -print.
Разница в выводе echo может заключаться в том, что echo пытается интерпретировать экранирование самого себя. Различные версии echo в этом вопросе совершенно несовместимы.
Моя ошибка. Команда echo действительно выводит * .txt
Что ж, предложения от francesco работают. Но меня все еще смущает поведение здесь. Мы знаем, что использование подстановочных знаков без кавычек в команде поиска обычно приводит к ошибке. А именно:
find . -name *.txt -print
find: paths must precede expression:
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 фактически выполнил поиск с одинарными кавычками, заключенными в аргумент, что позволило найти работу.
Проблема решена. :)!
Вы уверены, что есть файлы
*.txtдля печати? Что печатаетfind . -name \*.txt -print?