Bir öğretici ile çalışan ve her iki kullanımını gördüm cat myfile.txtve cat < myfile.txt. Bu iki komut dizisi arasında bir fark var mı? Her ikisi de bir dosyanın içeriğini kabuğa yazdırıyor gibi görünüyor.
Bir öğretici ile çalışan ve her iki kullanımını gördüm cat myfile.txtve cat < myfile.txt. Bu iki komut dizisi arasında bir fark var mı? Her ikisi de bir dosyanın içeriğini kabuğa yazdırıyor gibi görünüyor.
Yanıtlar:
İ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 .
sudo cat myfile.txt. Ancak sudo cat < myfile.txtdosyayı okuma ayrıcalıklarınız yoksa işe yaramayacaktır.
ksh93kendi catdüşünceniz için /opt/ast/binerken dönmediğiniz sürece varsayılan olarak etkin değildir $PATH).
wcbir argüman verildiğinde sayımdan önce dosya adını yazdıracaktır.
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.
kshdolayı, kendi iradesini gerçekten kullanıyor musun ve öyleyse ... neden ?
bash, ksh93çok uzakta daha iyi kabuk. öyle neredeyse, kabuk.
cat < file1 > file2çok farklı bir etkiye sahiptir cat file1 > file2durumunda file1okunmaz veya hiç yok. (İkinci biçim kısalır file2; eskisi olmaz.)
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 .
@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.
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.
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.