Цитаты в grep в bash с аргументами - PullRequest
1 голос
/ 10 марта 2020

У меня есть этот скрипт, который находит некоторый текст (привет) во всех pdf-файлах в текущем каталоге

find . -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep "hello" -iF --with-filename --label="{}" --color' \;

Я хочу использовать первый аргумент вместо фиксированной строки. Я заменил "hello" на "$1", "\"$1\"" и другие комбинации безрезультатно.

Я думаю, что это проблема с двойными кавычками вокруг $1 и внутри одинарных кавычек.

Можете ли вы помочь мне с этим?

1 Ответ

3 голосов
/ 10 марта 2020

Более безопасная версия этого кода выглядит следующим образом:

text_to_search_for="hello"
text_to_search_for="$text_to_search_for" find . -name '*.pdf' -exec sh -c '
  for file do
    pdftotext "$file" - | grep "$text_to_search_for" -iF --with-filename --label="$file" --color
  done
' sh {} +

Примечание:

  • Помещение text_to_search_for="$text_to_search_for" перед find в той же строке означает, что мы экспортируем переменную text_to_search_for в среду только на время выполнения этой одной команды.
  • Мы передаем текст для поиска в качестве переменной среды в копию find we ' выполняется, что, в свою очередь, позволяет ему наследоваться копией sh, с которой начинается find.
  • Мы никогда не используем {} внутри строки, переданной как аргумент sh -c, но используйте его только при генерации аргументов этой команды. Это абсолютно важно как для мобильности, так и для безопасности стандарт POSIX для find не гарантирует, что {} будет работать, когда подстрока, а не полная строка, и что более важно, {}, подставляемая в код, означает, что имена файлов, по которым вы перебираете файлы, могут использоваться для атаки на ваш system.
  • Мы используем sh {} +, чтобы передать несколько имен файлов для каждой копии sh, и for file do, чтобы назначить каждое в терминах переменной file. (sh является заполнителем для $0, поэтому имена из find присваиваются $1 и более поздним; $0 используется в сообщениях об ошибках, поэтому любой заполнитель, используемый в этой позиции, должен быть чем-то, что имеет смысл, если печатается вместе с ошибкой).
...