İlk olarak, etkileşimli bir kabuğa komutun bir parçası olarak yazılsa cat
bile, mutlaka bir terminal olması gerekmeyen standart çıktıya yazar cat
. Standart çıktı yönlendirildiğinde bile terminale yazmak için bir şeye ihtiyacınız varsa, bu o kadar kolay değildir (hangi terminali belirtmeniz gerekir, komut komuttan çalıştırılırsa bir tane bile olmayabilir). (ab) komut yalnızca bir boru hattının bir parçasıysa standart hata çıktısını kullanabilir. Ama cat
işi gerçekten yaptığını söylediğinden beri , böyle bir durum hakkında soru sormadığını düşünüyorum.
Amacınız bir boru hattına standart çıktıya yazılanları göndermek olsaydı, o zaman kullanarak cat
uygun olacaktır Kedi Ödülü Yararsız Kullanımı beri, cat file | pipeline
(burada pipeline
herhangi bir boru hattı için duruyor) daha verimli olarak yapılabilir <file pipeline
. Fakat yine de, sizin ifadelerinizden bunun sizin niyetiniz olmadığını anlıyorum.
Bu yüzden endişelendiğin şey o kadar net değil. Yazmak için cat
çok uzun bulursanız , bir veya iki karakterli takma ad tanımlayabilirsiniz (standart Unix'te kullanılmayan kalan birkaç isim vardır). Ancak cat
işe yaramaz döngüleri harcayan endişeleriniz varsa, yapmamalısınız.
null
Argüman almayan ve standart girdiyi standart çıktıya (boru hatları için nötr nesne) kopyalayan bir program olsaydı , istediğinizi yapabilirsiniz <file null
. Böyle bir program yoktur, ancak yazması kolay olur (yalnızca bir satırlık main
işlevli bir C programı işi yapabilir), ancak cat
argüman olmadan çağrı yapmak (ya cat -
da açık olmak istiyorsanız) bunu yapar.
Bir olsaydı nocat
tam olarak bir dosya ismi argümanı programı yapamam, eğer şikayet, dosyayı açmaya çalışırsa, aksi takdirde, o sizin için soruyorsunuz sadece ne olacağını standart çıkışa dosyadan kopyalamak ilerler. null
Dosyayı açmak, test etmek ve muhtemelen şikayette bulunmak gibi ana işlerden yazmak biraz daha zordur (titizseniz, tam olarak bir argüman olduğuna dair bir test eklemek ve başka türlü şikayet etmek de isteyebilirsiniz). Fakat yine de cat
, şimdi tek bir argümanla sağlanan, sadece bunu yapar, bu nedenle herhangi bir nocat
programa gerek yoktur .
nocat
Programı yazmayı başardıktan sonra , neden tek bir tartışmada durdun? Kodu bir döngüye sokmak for(;*argp!=NULL;++argp)
gerçekten hiç çaba sarf etmiyor, ikiliye en fazla birkaç makine talimatı ekliyor ve yanlış sayıda argümandan (daha fazla talimatı saklayan) şikayet etmekten kaçınıyor. Voilà cat
, birleştirici dosyaların ilkel bir sürümü . (Dürüst olmak gerekirse, biraz düzenlemelisiniz, böylece argümanlar olmadan aynı şekilde davranırlar null
.)
Tabii ki gerçek cat
programda, her zaman yaptıkları için birkaç çan ve ıslık eklediler. Ancak öz, cat
maliyetlerin “birleştirilmesi” özelliğinin , ne programcı ne de makineyi yürüten makine için gerçekten hiç çaba sarfetmemesidir. Bu tür programların yokluğunu cat
vurguladığı null
ve nocat
açıkladığı gerçeği . cat
Sonuç bir boru hattına girerse tek bir argüman kullanmaktan kaçının , ancak sadece terminaldeki dosya içeriğini göstermek için kullanılıyorsa, bağlantılı olduğum sayfa bile bunun yararlı bir kullanım olduğunu kabul eder, bu cat
yüzden tereddüt etmeyin.
Bunu test edebilir cat
gerçekten hypthetical etrafında basit bir döngü tarafından uygulanmaktadır nocat
arayarak işlevselliği cat
yerine hemen bu dosya var olmadığını şikayet yerine,: Bir geçersiz ad değil, birinci konumda aralarında birkaç dosya adları ile cat
ilk önce gelen döker geçerli dosyalar ve ardından geçersiz dosya hakkında şikayetler (en azından kedimin davranış şekli budur).