Bir öğretici ile çalışan ve her iki kullanımını gördüm cat myfile.txt
ve 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.txt
ve 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, cat
dosyayı açar ve ikinci durumda, kabuk dosyayı cat
standart giriş olarak geçirerek açar .
Teknik olarak, farklı etkileri olabilir. Örneğin, cat
programdan 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 cat
aynı program olmadığını belirttiğinden bahsetti .
sudo cat myfile.txt
. Ancak sudo cat < myfile.txt
dosyayı okuma ayrıcalıklarınız yoksa işe yaramayacaktır.
ksh93
kendi cat
düşünceniz için /opt/ast/bin
erken dönmediğiniz sürece varsayılan olarak etkin değildir $PATH
).
wc
bir 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; cat
birincisinde 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 cat
siz zsh
ve 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 cat
dosya erişim haklarında hiçbir fark yoktur, böylece her ikisi de eşit şekilde başarısız olur. Kullanılması sudo
yükseltmek cat
Thomas Dickey zaten önerilen bir yorum cevap ve ilişikte 'ın ayrıcalıkları, davranış büyük bir fark yaratacak.
ksh
dolayı, 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 > file2
durumunda file1
okunmaz veya hiç yok. (İkinci biçim kısalır file2
; eskisi olmaz.)
cat myfile.txt
dosyayı okur myfile.txt
sonra standart çıktıya yazdırır.
cat < myfile.txt
Burada cat
açı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 <file3
En 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 file3
tü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.
cat
yine açılacaktır file1
ve file2
aynı, file4
ve file5
üçüncü örnekte. Sadece gösterecek file3
, cevap verecek . file6
bu ö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.