Aliasowanie grep w opcji -exec find

Sep 05 2020

Mam te aliasy w moim ~/.bashrc

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

ale nie mają one żadnego efektu, kiedy uruchamiam find ... -exec grep ...i zawsze muszę podawać te opcje ręcznie.

Czy istnieje sposób, aby powiedzieć, findaby polegać na aliasach w -execargumentach opcji? Myślę o plikach konfiguracyjnych, a nie o innych aliasach.

Czy byłoby to w jakiś sposób niebezpieczne?

Odpowiedzi

1 Noname Sep 05 2020 at 00:15

Nie możesz używać takich aliasów. Aliasy działają tylko wtedy, gdy są używane jako pierwsze w długiej sekwencji poleceń, powłoka zasadniczo zastępuje tekst aliasu faktycznym poleceniem. Kiedy wprowadzasz polecenie, powłoka najpierw szuka aliasu, następnie funkcji i tak dalej. Podstawianie poleceń / zastępowanie aliasów nie działa, jeśli używasz aliasu w środku sekwencji poleceń.

Co więcej, -execflaga find, zawsze utworzy oddzielny proces wykonujący plik binarny, a nie alias ani funkcję, która jest zakodowana na stałe.

1 steeldriver Sep 05 2020 at 00:33

Niektóre powłoki pozwalają na rozwinięcie aliasów w dowolnym miejscu w wierszu poleceń - na przykład zshmają koncepcję aliasu globalnego ,alias -g 'grep=grep --color=auto -H'

Jeśli jednak twoją powłoką interaktywną jest bash, aliasy są interpretowane tylko wtedy, gdy pojawiają się jako pierwsze słowo polecenia, więc musisz zawinąć grepwywołanie w powłokę i wywołać powłokę w sposób, który powoduje ~/.bashrcodczytanie pliku, jak w interaktywnej sesji powłoki.

Na przykład

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

ODPOWIEDŹ, nie jest to w żaden sposób niebezpieczne - jednak wiąże się to z pewnym narzutem i nie jest o wiele wygodniejsze niż po prostu dostarczanie żądanych opcji bezpośredniego grepa.