Küçüktür işareti neden bash'deki kedinin yerine geçmiyor?


17

"Kedinin yararsız kullanımı" hakkında bir şeyler duydum ve bazı öneriler buldum, ama aşağıdaki benim bash kabuğumda hiçbir şey çıktı.

< filename

Kedi kullanımı beklendiği gibi çalışıyor.

cat filename

Fedora Core 18 ve GNU bash, sürüm 4.2.45 (1) kullanıyorum.

EDIT: Bir boru önünde kullanmak da işe yaramaz.

< filename | grep pattern

Oysa kedi kullanımı beklendiği gibi çalışıyor.

cat filename | grep pattern

EDIT2: Açıklığa kavuşturmak için bunu kullanabileceğimi biliyorum

grep pattern < filename

ancak burada /programming/11710552/useless-use-of-cat komutunu da kullanabileceğimi okudum . Yine de komutun önünde çalışmaz.


2
İşe yarıyor. Denediğin şey Jonathan Leffler'in yorumunun önerdiği gibi değil.
— manatwork

"Kedinin amacı dosyaları birleştirmektir (veya" katener "). Tek bir dosyaysa, hiçbir şeyle birleştirmemek zaman kaybıdır ve size bir işlem maliyeti." partmaps.org/era/unix/award.html
— Bonsi Scott

Yanıtlar:


22

Küçüktür ve sembolü ( <) dosyayı açar ve bazı uygulama / programların standart giriş aygıtı tutamağına bağlar. Ancak kabuğa girdiyi eklemek için herhangi bir uygulama vermediniz.

Misal

Bu 2 örnek aslında aynı şeyi yapar, ancak girdilerini biraz farklı 2 şekilde alırlar.

dosyayı açar

$ cat blah.txt 
hi

STDIN'i açar

$ cat < blah.txt 
hi

Perdenin arkasına bakmak

straceNeler olup bittiğini görmek için kullanabilirsiniz .

Bir dosyadan okuduğumuzda

open("blah.txt", O_RDONLY)              = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=3, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "hi\n", 65536)                  = 3
write(1, "hi\n", 3hi
)                     = 3
read(3, "", 65536)                      = 0
close(3)                                = 0
close(1)                                = 0

STDIN'den okuduğumuzda (0 olarak tanımlanır)

read(0, "hi\n", 65536)                  = 3
write(1, "hi\n", 3hi
)                     = 3
read(0, "", 65536)                      = 0
close(0)                                = 0
close(1)                                = 0

İlk örnekte catdosyayı açan ve okunan dosyayı görebiliriz blah.txt. İkincisi cat, dosyanın içeriğini blah.txt0 tanımlayıcı numarası olarak tanımlanan STDIN dosya tanımlayıcısı aracılığıyla okuduğunu görebiliriz .

read(0, "hi\n", 65536)                  = 3

1
Yani kedinin yararsız kullanımı hakkındaki bu konuşma sahte mi?
— böcek

@bug - hayır, kullanımları var. Ancak catgenellikle yanlış anlaşılır ve gerekli olmadığında kullanılır.
— slm

Ancak operasyonların sırasını soldan sağa korumak istediğimde gereklidir? Komutun önünde de daha az yapı kullanmanın mümkün olduğunu okudum.
— böcek

@bug evet yönlendirme komuttan önce veya sonra gerçekleşebilir, Stephane'ın cevabına bakın, bu örneği de gösterir.
— slm

Ah, şimdi anladım. Yazmam gerekecekti < filename command.
— böcek

14

Klasik yararsız kullanımı cat dosyaları doğrudan doğrudan açabilen programlara girdi vermek için kullanmanızdır. Örneğin:

Kötü

cat file | grep foo
cat file | while read line; do echo "$line"; done
cat file | sed 's/a/b/'
cat file | awk '{print $1}'

İyi

grep foo file
while read line; do echo "$line"; done < file 
sed 's/a/b/' file
awk '{print $1}' file

Ayrıca iyi ( <filekomutun her iki tarafında olabilir)

<file grep foo
 sed 's/a/b/' < file
<file awk '{print $1}' 

6
"Kötü" burada özneldir. Çünkü gerçek bu, daha iyi genel olarak bu bulmak yolu daha tutarlı ve daha kolay okunur. Veri akışı tamamen soldan sağa doğrudur, çünkü daha fazla boru varsa
— Izkata

2
@Izkata yararsız oldukları anlamında "kötü" cat.
— terdon

"Aşağı! Masadan çekilin! Sen kötü bir kedisin! ”;-) Ama cidden…
— G-Man

1
İyi Dikkate Değer (veya en azından kullanışlı) kullanımları cat(1) içermektedir cat file(ekrana çıktı / terminal ile; dosya filtresi yüksektir daha uzun ise, kullanmayı tercih olabilir ancak moreya lessya benzer bir şey), (2) cat file1 file2 file3 > all_data( tam olarak ne anlama catgeliyor), (3) cat f1 f2 f3 | tr …(veya dosyaları doğrudan aktarmak istemediğiniz başka bir programa aktarın; örneğin, wc(örneğin, yalnızca genel toplamı görmek istiyorsanız) veya grep(örneğin, desteklemeyen eski bir sürümünüz varsa -h, yani --no-filename)),… (Devam ediyor)
— G-Man,

(Devam)… (4) cat -n file | sort … -k1 | sed 's/^ *[0-9]*\t//', (5) sudo cat file600 | untrusted_program(yani siz (UID'niz) dosyayı okuyamazsınız ve programı kök veya yarı ayrıcalıklı UID olarak çalıştırmak istemezsiniz). Ayrıca, ( e ) (yani, 2 ile 3 arasında bir sayı) program_that_generates_html | cat static_html_header - static_html_footer( büyük olasılıkla bir dosyaya veya boruya yönlendirmek istersiniz).
— G-Man, 'Monica'yı Yeniden Başlat' diyor

13

UUOC şuradadır:

cat somefile | some-cmd

veya

cat < somefile | some-cmd

Orada, kendisinin okuduğu beslenen bir borudan some-cmdiçeriğini okuyor .somefilecatsomefile

some-cmddoğrudan okuyabilir somefile(kabuk stdin'de açtıktan sonra), aşağıdakilere gerek yoktur cat:

some-cmd < somefile

veya

< somefile some-cmd

(yönlendirmeler basit bir komut satırında herhangi bir yerde görünebilir).

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.