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.