“Xargs” ve komut değiştirme arasındaki fark nedir?


14

Birçok durumda yerine komut değiştirme kullanıyorum xargs. Örneğin rm $(ls), aynıls | xargs rm

Aralarındaki farklar gerçekten nedir?

Farklılıklardan biri, xargsgeçerli kabukta çalışırken komut ikamesinin alt kabukta çalıştığıdır, ancak emin değilim.

Lütfen farkları listeleyin.

Yanıtlar:


9

Bir fark, bir boru yerine komut değiştirme kullanıldığında, iletilen verilerin boyutu komut arabelleğinin boyutu ile sınırlıdır, bu nedenle bazı durumlarda uyarı yapılmadan kesilir. Bu aynı zamanda tüm komut çıkışının bir sonraki komuta geçmeden önce üretilmesi ve bellekte saklanması gerektiği anlamına gelir, böylece büyük çıkışlar için gerekenden çok daha fazla bellek kullanabilirsiniz.

İlk yöntemle ilgili bir başka sorun, çıktının boşlukta bölünmesidir, bu nedenle içindeki boşluklarla dosya adlarını işleyemezsiniz. xargsboşluk sorunundan da etkilenir, ancak kullanılan sınırlayıcı değiştirilerek düzeltilebilir. Bu arada dosya adlarını düzgün bir şekilde işlemek için, ikinci örnekte boş baytı sınırlayıcı olarak kullanmanız gerekir.

Üçüncü bir sorun, glob'ların genişletilmesidir, bu nedenle bir dosya adında yıldız işaretleri veya soru işaretleri varsa, beklenmedik sonuçlar olacaktır.

Konu hakkında güzel bir tartışma burada bulabilirsiniz: http://mywiki.wooledge.org/ParsingLs

Doğru sözdizimi

echo rm *

veya xargs kullanmanız gerekiyorsa,

find . -maxdepth 1 -print0 | xargs -0 echo rm

echoÇıktı doğru göründüğünde çıkarın .


1
@Sinoosh: xargssiz etkinleştirmedikçe boru nedeniyle bir alt kabukta da çalışır shopt -s lastpipe, bu durumda geçerli kabukta çalışır. Değişkenleri değiştirmediğiniz için, bu durumda bir alt kabukta çalışmanın bir sorun olduğunu düşünmüyorum.
user000001

1
@Sinoosh: Bağımsız değişkenleri tek tek iletmek için -lbayrağını kullanabilirsiniz find . -maxdepth 1 -print0 | xargs -0 -l rm. İkinci soru için, kullanmak olamaz lsile xargs -0ancak (BTW Dosya adlarında geçerlidir) satırsonu ile, ls boş Bute üzerinde çıktı bölmek değil çünkü
user000001

1
@Sinoosh: İlk paragraf değil, ikincisi: -0seçeneği olmayan xargs boşluk sorunundan muzdarip.
user000001

1
Okuyun man xargs, echotest için kullanın , değil rm. xargskabuk sınırlarını aşmamızı sağlar (bazı tamponlar 65K ile sınırlıdır, dosya adları listesi değildir).
vals

1
@Sinoosh: Kullanışlı iyi bir referansım yok, ancak yazabilirsiniz xargs --show-limitsve sisteminizde belirlenen sınırı göreceksiniz,
user000001
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.