"Tip" komutuna borulama


10

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

Bence Oli cevabı en iyi cevap. Kaos cevabı işe yarıyor, ancak Oli cevabı akıllı.
Helio

Yanıtlar:


17

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".


3
Yoğunlaştırabilirsinizfind ... -exec bash -c 'type "$@"' _ {} +
muru

2
@muru gerçekten, kendi cevabımı tekrar okudum ve gördüm =)
kaos

11

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 ).


1
Teşekkürler Oli! Bu linux acemi bugün "tip" ve davranışları hakkında yeni bir şeyler öğrendi.
LjinKazama
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.