Передача аргумента bash -c для поиска

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

find . -name \*.txt -print

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

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

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

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

. -name *.txt -print

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

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

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

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

Вы уверены, что есть файлы *.txt для печати? Что печатает find . -name \*.txt -print?

Barmar 15.01.2019 22:48

Итак, проблема, которую я вижу, заключается в том, что использование bash -c дает процессору bash две возможности для расширения *.txt. Я не уверен, что это за исправление

Gem Taylor 15.01.2019 22:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
496
2

Ответы 2

Похоже, вы пытаетесь использовать "\*.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 в этом вопросе совершенно несовместимы.

Gordon Davisson 16.01.2019 00:03

Моя ошибка. Команда echo действительно выводит * .txt

Greg 16.01.2019 01:02

Что ж, предложения от 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 фактически выполнил поиск с одинарными кавычками, заключенными в аргумент, что позволило найти работу.

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

Другие вопросы по теме