Bir diğer ad, tanımlandığı kabuğun içindedir. Diğer işlemler tarafından görülemez. Aynı şey kabuk işlevleri için de geçerlidir. xargskabuk olmayan ayrı bir uygulamadır, bu nedenle takma ad veya işlev kavramına sahip değildir.
Xargs'ın grepdoğrudan çağırmak yerine bir kabuk çağırmasını sağlayabilirsiniz . Ancak sadece bir kabuk çağırmak yeterli değildir, o kabuktaki diğer adı da tanımlamanız gerekir. Takma ad, öğenizde tanımlanmışsa .bashrcbu dosyayı kaynaklayabilirsiniz; ancak bu, .bashrcetkileşimli olmayan bir kabukta anlamlı olmayan diğer görevleri gerçekleştirdiğinizde çalışmayabilir .
find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E regex_here "$@"' _
Normal ifadeyi yazarken iç içe alıntıların karmaşıklıklarına dikkat edin. Normal ifadeyi kabuğa parametre olarak geçirerek hayatınızı kolaylaştırabilirsiniz.
find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E "$0" "$@"' regex_here
Takma ad aramasını açıkça gerçekleştirebilirsiniz. Sonra xargsgöreceksiniz grep -n --color=always.
find . -name '*.py' | xargs "${BASH_ALIASES[grep]}" regex_here
Zsh dilinde:
find . -name '*.py' | xargs $aliases[grep] regex_here
Bu arada, find … | xargs … boşluk içeren dosya adlarını (diğerleri arasında) bozduğunu unutmayın . Boş sınırlandırılmış kayıtlara geçerek bunu düzeltebilirsiniz:
find . -name '*.py' -print0 | xargs -0 "${BASH_ALIASES[grep]}" regex_here
veya şunu kullanarak -exec:
find . -name '*.py' -exec "${BASH_ALIASES[grep]}" regex_here {} +
Aramak yerine, findher şeyi tamamen kabuğun içinde yapabilirsiniz. Glob paterni **/dizinleri tekrar tekrar dolaşır. Bash'da, shopt -s globstarönce bu glob desenini etkinleştirmek için koşmanız gerekir .
grep regex_here **/*.py
Bunun bazı sınırlamaları vardır:
- Çok sayıda dosya eşleşirse (veya uzun yolları varsa), komut maksimum komut satırı uzunluğunu aştığı için başarısız olabilir.
- Bash ≤4.2'de (ancak daha yeni sürümlerde ya da ksh veya
**/zsh'da ), dizinlere sembolik bağlar halinde geri çekilir.
Başka bir yaklaşım, MariusMatutiae tarafından önerildiği gibi süreç ikamesini kullanmaktır .
grep regex_here <(find . -name '*.py')
Bu **/geçerli olmadığında kullanışlıdır : karmaşık findifadeler için veya h4.2 basamağında sembolik bağlar altında geri almak istemediğinizde. Bunun boşluk içeren dosya adlarını bozduğunu unutmayın; bir çözüm, globbing'i ayarlamak IFSve devre dışı bırakmaktır , ancak biraz karmaşık olmaya başlar:
(IFS=$'\n'; set -f; grep regex_here <(find . -name '*.py') )