“Kedi” ve “kedi <” arasındaki fark


Yanıtlar:


106

İlk durumda, catdosyayı açar ve ikinci durumda, kabuk dosyayı catstandart giriş olarak geçirerek açar .

Teknik olarak, farklı etkileri olabilir. Örneğin, catprogramdan daha fazla (veya daha az) ayrıcalıklı bir kabuk uygulamasına sahip olmak mümkün olacaktır . Bu senaryoda, biri dosyayı açarken diğeri olabilir.

Bu olağan bir senaryo değil, ancak kabuğun cataynı program olmadığını belirttiğinden bahsetti .


83
Evet, örneğin yapabilirsiniz sudo cat myfile.txt. Ancak sudo cat < myfile.txtdosyayı okuma ayrıcalıklarınız yoksa işe yaramayacaktır.
zuazo

2
Yerleşik olduğunu unutmayın ( ksh93kendi catdüşünceniz için /opt/ast/binerken dönmediğiniz sürece varsayılan olarak etkin değildir $PATH).
Stéphane Chazelas

2
Bazı programlar bir dosya adı argümanı veya stdin alıp almadıklarına bağlı olarak farklı davranır. Örneğin, wcbir argüman verildiğinde sayımdan önce dosya adını yazdıracaktır.
Barmar

21

Test durumunuzda gözle görülür bir fark yoktur. En açık olanı myfile.txt, geçerli dizinde bir dosya yoksa ya da okumasına izin verilmiyorsa, aldığınız hata mesajı olacaktır .

Eski durumda, catşikayet edecek ve ikinci durumda, kabuğunuz, hangi işlemin dosyayı açmaya çalıştığını açıkça gösterir; catbirincisinde ve sonuncusunda da kabuk.

$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]

Daha genel bir durumda, yönlendirme kullanmak büyük bir fark, birden fazla dosyanın içeriğini yazdırmak için kullanılamaz; bu, cat(yani cat enate) komutunun orijinal amacından sonra gelir . Yine de, kabuğun yeniden yönlendirilmiş girdi olarak geçen tüm dosyaları açmaya çalışacağını, ancak catsiz zshve multios"zshism" özelliğini kullanmadıkça yalnızca sonuncuyu geçeceğini unutmayın.

$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the shell opens one then opens two, fails and 
                  # displays an error message, cat gets nothing on stdin
                  # so shows nothing
ksh93: two: cannot open [No such file or directory]

Standart bir sistemde, kabuk ve catdosya erişim haklarında hiçbir fark yoktur, böylece her ikisi de eşit şekilde başarısız olur. Kullanılması sudoyükseltmek catThomas Dickey zaten önerilen bir yorum cevap ve ilişikte 'ın ayrıcalıkları, davranış büyük bir fark yaratacak.


5
Meraktan kshdolayı, kendi iradesini gerçekten kullanıyor musun ve öyleyse ... neden ?
kedi

1
@ cat - bu soru açıkça cehalet üzerine kuruludur. kendin yap ve gör.
mikeserv

2
saygısız, ciddiyetle kaba olmayan, ama yeterince adil olması amaçlanan @mikeserv, sanırım
kedi

2
@ cat - Aksini sanmıyorum. cehalet, utanılacak bir şey değildir - sadece bilgi eksikliğidir. Birisinin neden ksh93'ü kullanmayı seçtiğini anlamıyorsanız, o zaman sadece onu hiç kullanmadığınızdan dolayı olduğunu varsayabilirim. bu yüzden yapmanı tavsiye ederim. emin olmak için denemeye değer. i ile karşılaştırıldığında, bu, size ne zaman ve inan bana bash, ksh93çok uzakta daha iyi kabuk. öyle neredeyse, kabuk.
mikeserv

5
@Mikeserv belirttiği gibi başka yerde , cat < file1 > file2çok farklı bir etkiye sahiptir cat file1 > file2durumunda file1okunmaz veya hiç yok. (İkinci biçim kısalır file2; eskisi olmaz.)
Wildcard

7

cat myfile.txtdosyayı okur myfile.txtsonra standart çıktıya yazdırır.

cat < myfile.txtBurada cataçılacak dosya (lar) bulunmuyor, pek çok Unix komutunda olduğu gibi file.txt, kabuk tarafından yönlendirilen ve standart çıktıya basılan standart girdiden gelen verileri okuyor .


6

@Thomas Dickey 'in yanıtı mükemmel.

Sadece birkaç dosyayı okumaya ilişkin bazı gerçekleri eklemek istiyorum (sorunuzla ilgili olarak gevşek bir şekilde, ancak yine de):

  • cat <file1 <file2 <file3En azından bash, sadece file3 okuyacak. (Aslında, kabuk bağlıdır, ancak en kabukları olacak dup etkisi sonuncusu neden stdin'e her belirtilen dosyayı.)
  • cat file1 file2 file3tüm belirtilen dosyaları sırayla okuyacaktır (aslında kedi birleştirme kelimesinin kısaltılmış halidir ).
  • cat file1 file2 file3 <file4 <file5 <file6 sadece dosya1, dosya2, dosya3'ü okuyacak (dosya adı argümanları iletildiğinde kedi stdin'i yoksayar gibi).
    • cat file1 file2 - file3 <file4 <file5 <file6 file1, file2, file6, file3'ü okuyacaktır (tireyi yok etmemek için tireyi zorlar).

Ve hatalar hakkında. Yetersizlik durumunda etmek açmaya (olmadan bağımsız değerler olarak bazı dosyaları <, kedi (stderr'e ilgili mesaj çıktısı ile) başarısız dosyaları atlar), ama yine de diğer dosyaları okuyun. Yönlendirme olarak belirtilen dosyalardan en az birini açamama durumunda (with <), kabuk cat'ı bile başlatmaz (bu, aslında cat tarafından kullanılmayan yönlendirmeler için bile geçerlidir). Her iki durumda da hatalı çıkış kodu döndürülür.


1
İlk örnekte unutmayın catyine açılacaktır file1ve file2aynı, file4ve file5üçüncü örnekte. Sadece gösterecek file3, cevap verecek . file6bu önceki açık talimatlar başarılı olursa, içerik.
jlliagre

@jlliagre, teşekkürler, bunu bilmiyordum. Strace açıkça doğruluğunu kanıtladı. Durum 1 ve 3a için parantez içindeki metni düzelttim.
sasha

0

arasındaki farkı görmek için başka bir komut kullanabiliriz:

wc –w food2.txt .

Mümkün çıktı:

6 food2.txt .

komut, dosya adını bildiği için söyler (bağımsız değişken olarak iletilir).

wc –w < food2.txt .

Mümkün çıktı:

6 .

standart girdi komutu bilmeden food2.txt dosyasına yönlendirilir.

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.