Псевдоним grep в параметре find -exec

Sep 05 2020

У меня есть эти псевдонимы в моем ~/.bashrc

alias grep='grep --color=auto -H'
alias fgrep='fgrep --color=auto -H'
alias egrep='egrep --color=auto -H'

но они не действуют, когда я бегу find ... -exec grep ..., и мне всегда приходится вводить эти параметры вручную.

Есть ли способ указать findполагаться на псевдонимы в -execаргументах параметра? Я думаю о файлах конфигурации, а не о других псевдонимах.

Было бы это в чем-то небезопасно?

Ответы

1 Noname Sep 05 2020 at 00:15

Вы не можете использовать такие псевдонимы. Псевдонимы работают, только если они используются первыми в длинной последовательности команд, оболочка в основном заменяет текст псевдонима фактической командой. Когда вы вводите команду, оболочка сначала ищет псевдоним, затем функцию и так далее. Подстановка команд / подстановка псевдонима не работает, если вы используете псевдоним в середине последовательности команд.

Кроме того, -execфлаг find, всегда будет порождать отдельный процесс, выполняющий двоичный файл, ни псевдоним, ни функцию, которые жестко запрограммированы.

1 steeldriver Sep 05 2020 at 00:33

Некоторые оболочки позволяют расширять псевдонимы в любом месте командной строки - например, zshимеют концепцию глобального псевдонима ,alias -g 'grep=grep --color=auto -H'

Однако если ваша интерактивная оболочка - bash, псевдонимы раскрываются только тогда, когда они появляются в качестве первого слова команды, поэтому вам нужно будет обернуть grepвызов в оболочку и вызвать оболочку таким образом, чтобы ваш ~/.bashrcфайл был прочитан, как будто в интерактивном сеансе оболочки.

Например

find . -name '*.txt' -exec bash -ic 'for f do grep foo "$f"; done' find-bash {} +

AFAIK это ни в коем случае не небезопасно - однако это имеет некоторые накладные расходы и вряд ли удобнее, чем просто предоставить желаемые параметры для grep напрямую.