Birkaç komutun türünü bulmak istiyorum. O boru veya mümkün mü xargsgelen bir arama sonucunda findiçine typeLinux komutu?
Örneğin:
find . -name anacron | type
veya
find . -name anacron | xargs type
Birkaç komutun türünü bulmak istiyorum. O boru veya mümkün mü xargsgelen bir arama sonucunda findiçine typeLinux komutu?
Örneğin:
find . -name anacron | type
veya
find . -name anacron | xargs type
Yanıtlar:
typenormal bir komut değildir. Bir kabuk buitin. Görmek:
$ type type
type is a shell builtin
Yani, çağırmaya gerek bashile -cistediğini elde etmek için
$ find . -name anacron | xargs -I '{}' bash -c "type {}"
Ya da daha basit (gerek yok xargs):
$ find . -name anacron -exec bash -c "type {}" \;
bash -c "type ./file"Tarafından bulunan her dosyayla arayacaktır find. -Iiçinde xargsyollarla, burada bir yer tutucu tanımlamak {}daha sonra kullanmak. Bu yer tutucu, bulunan dosya adıyla değiştirilir.
Neden kabuk yapıları aşağıdakilerle çalışmaz xargs:
[...] Yerleşik komutlar kabuğun içinde bulunur. Yerleşik bir komutun adı basit bir komutun ilk sözcüğü olarak kullanıldığında, kabuk komutu başka bir program çağırmadan doğrudan yürütür. [...]
xargs, standart girişteki öğeleri okur, [...] ve komutu çalıştırır
Bu durumda komut basit bir çıkarılabilir ve bir kabuk yerleşimi yürütülebilir değil. Dosya sisteminde bulunamıyor. Kabuğun içinde. Bu yüzden kabuğu çağırmalı ve yerleşik komutu çağırmak için çağrılan kabuğu söylemelisiniz. İşte böyle oldu bash -c "command".
find ... -exec bash -c 'type "$@"' _ {} +
Burada birkaç sorun var (bazıları zaten vurgulanmış):
typebir yerleşiktir. Çözülmüş bir komut değil, bash içindeki bir işlev. Bkz man bash-builtins. Sadece bash bağlamında çalışır, bu yüzden bir xargsveya -execçatallı alt kabuk değil.typekendi yol araştırmasını yapmaya alışkındır. Eğer bir yol verirseniz ( findyapmayacağınız gibi), muhtemelen bu yolu döndürecektir. readlink -fsembolik bağlantıları çözmeye çalışıyorsanız daha iyi olabilir; ve tüm gün boyunca xargs readlinkya da -exec readlink -f {} +gün içinde boru oluşturabilirsiniz .Bu, yapmaya çalıştığınız şeyi yapamayacağınız anlamına gelmez. İki seçenek vardır. typeKomut sadece bir kerede hepsini isimleri sağlayabilir böylece aynı anda birçok isim işleyebilir:
type $(find /usr/sbin -name anacron)
Birçok komut için, çok fazla bağımsız değişken varsa, komut satırı uzunluk sınırını aşmış olursunuz (bkz. getconf ARG_MAX). Ancak, bu durumda typekabuk içinde yerleşik olduğu ve yeni bir işlem kimliği oluşturmadığı için geçerli olmaz (uzunluk sınırı, normal bir komut satırında alt işlem tarafından kullanılan exec () işlevi için geçerlidir ).