Birkaç komutun türünü bulmak istiyorum. O boru veya mümkün mü xargs
gelen bir arama sonucunda find
içine type
Linux 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ü xargs
gelen bir arama sonucunda find
içine type
Linux komutu?
Örneğin:
find . -name anacron | type
veya
find . -name anacron | xargs type
Yanıtlar:
type
normal bir komut değildir. Bir kabuk buitin. Görmek:
$ type type
type is a shell builtin
Yani, çağırmaya gerek bash
ile -c
istediğ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
. -I
içinde xargs
yollarla, 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ış):
type
bir 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 xargs
veya -exec
çatallı alt kabuk değil.type
kendi yol araştırmasını yapmaya alışkındır. Eğer bir yol verirseniz ( find
yapmayacağınız gibi), muhtemelen bu yolu döndürecektir. readlink -f
sembolik bağlantıları çözmeye çalışıyorsanız daha iyi olabilir; ve tüm gün boyunca xargs readlink
ya 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. type
Komut 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 type
kabuk 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 ).