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. xargs
kabuk olmayan ayrı bir uygulamadır, bu nedenle takma ad veya işlev kavramına sahip değildir.
Xargs'ın grep
doğ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 .bashrc
bu dosyayı kaynaklayabilirsiniz; ancak bu, .bashrc
etkileş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 xargs
gö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, find
her ş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 find
ifadeler 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 IFS
ve devre dışı bırakmaktır , ancak biraz karmaşık olmaya başlar:
(IFS=$'\n'; set -f; grep regex_here <(find . -name '*.py') )