`Cat <> file` nasıl çalışır?


42

cat < fileDosyanın içeriğini stdout'a yazdırır.

cat > fileCtrl+ Dalgılanana ve giriş metni dosyaya yazılana kadar stdin okur .

cat <> file, en azından Bash sürümünde, dosyanın içeriğini mutlu bir şekilde yazdırır (hatasız), ancak dosyayı değiştirmez veya değişiklik zaman damgasını güncellemez.

Bash standardı >, üçüncü ifadede görünüşte göz ardı edilen durumu nasıl haklı kılıyor - ve daha da önemlisi, herhangi bir şey yapıyor mu?

Yanıtlar:


47

Bash bir okuma-yazma dosya tanımlayıcısı<> oluşturmak için kullanır :

Yönlendirme operatörü

[n]<>word

Adı, dosya tanıtıcısı n'de hem okuma hem de yazma için açılacak olan kelimenin genişlemesi olan dosyanın, n belirtilmemişse, dosya tanıtıcısının 0 üzerindeki dosyaya neden olur. Dosya yoksa, oluşturulur.

cat <> filefileokuma-yazma işlemini açar ve tanımlayıcı 0'a (standart girdi) bağlar. Temelde, < filemantıklı bir şekilde yazılmış herhangi bir programla eşdeğerdir , çünkü hiç kimse normal olarak standart girdilere yazmaya çalışamaz, ancak eğer yapabilseydi.

- Doğrudan dışarı test etmek için basit C program yazabilirsiniz write(0, "hello", 6)yazacak helloiçine filestandart giriş yoluyla.

<>gerektiğini de başka herhangi bir POSIX uyumlu kabuğunda çalışmak aynı etkiyle.


1
Stdin'e ... Yazmak ... Bunun için geçerli bir kullanım davası var mı ?
Qix

3
Off-el, iyi bir şey düşünemiyorum. Açık bir tanımlayıcı ( 4<>file) vermek yararlıdır ve sanırım 0 dışında bıraktığınız zamanki gibi varsayılan değer iyidir. Stdout'tan okumak daha iyi değil.
Michael Homer

5
<>Ayrıca bazı sistemlerde (Linux gibi), adlandırılmış yöneltmeleri başka bir işlem yazmak için açana kadar engellemeden açmak yararlıdır.
Stéphane Chazelas

1
@ Qix: İyi yazma (0, "Şifre:", 10), bir tty benzeri bir şey hakkında bilgi istemediğiniz takdirde, bir şifre istemek için iyi bir yoldur. Sadece stderr'de görmeye alışkınım ama özellikle aynı teknik stdin üzerinde çalışmıyor.
Joshua,

3
@Qix - POSIX Gerekçesinden - <>Operatör, birkaç terminalle çalışan ve zaman zaman bir kabuk başlatmak isteyen bir uygulamayı yazmakta yararlı olabilir. Bu kabuk sıradan bir kontrol terminalinden çalışan uygulamaları çalıştıramazsa , komutları almak için standart bir hata okuyan <>çağrı cihazı gibi ... ... morekomutları, yani standart girdiyi ve standart çıktıyı kullanamaz. Her ikisi de normal kullanım için mevcuttur. cat food | more - >/dev/tty03 2<>/dev/tty03
mikeserv

38

<> filedosyayı (varsayılan olarak 0 tanımlayıcısı (stdin) üzerinde, varsayılan olarak, gibi <) okuma + yazma modunda kesmeden ve önceden oluşturmamışsa dosyayı oluşturur .

Bu sistem çağrısına O_RDWR|O_CREATgeçirilen bayraklara karşılık gelir open(). Buna karşılık <ise O_RDONLYve >olduğu O_WRONLY|O_CREAT|O_TRUNCve >> O_WRONLY|O_CREAT|O_APPEND.

Stdin yazılabilir olmak, uygulamalar genellikle kendi stdinlerine yazmadıklarından, genellikle yararlı değildir. Uygulamalar genellikle okumak için beklemeyin ve onlar başlangıçta almak dosya tanımlayıcılarda yazma; genellikle stdin'den (veya kendilerini açtıkları bir dosya tanımlayıcısından) okurlar ve stdout veya stderr'e (veya kendileri açtıkları bir dosya tanımlayıcısından) yazarlar.

<> kullanımları olabilir:

  • Sen tercih edebilirsiniz cat <> fileüzerinde cat < fileeğer komut başarısız istemiyorsanız fileyok ama boş bir fileyerine yarattı.
  • Kesmeyen yönü, <>dosyaların yerine yazılmasını sağlar. Ancak bu durumda, genellikle dosya tanıtıcısı 0'da kullanmazsınız:

    printf xxx 1<> file

    ilk 3 bayt yerine fileile xxx.

  • Linux gibi bazı sistemlerde, <>adlandırılmış bir boruda (FIFO) adlandırılmış bir boruyu bloke etmeden açar (başka bir işlemin diğer ucunu açmasını beklemeden) ve boru yapısının canlı kalmasını sağlar. Örneğin:

    mkfifo pipe; sed 's/foo/bar/g' <> pipe

    sedkendisine yazılan herhangi bir sayıdaki işlemden gelen verileri ele alır ve asla görmez eof.


1
AT&T ksh93'de <>varsayılan olarak (stdin) 1<>yerine (stdout 0<>) seçeneğine dikkat edin. Bu, bir sonraki sürümde bildirdiğim ve düzeltileceğim bir POSIX uyumluluk hatası. github.com/att/ast/issues/75 Ancak şu anki ksh93 versiyonları kullanımdan kalkana kadar, <>taşınabilir olarak kullanmak için dosya tanımlayıcı numarasını eklemelisiniz.
Martijn Dekker

@ MartijnDekker, biliyorum, ilk etapta size bunu söyleyen bendim ;-). Bunun yalnızca ksh93t + (davranışın değiştiği yer) ve üstü için olduğunu unutmayın.
Stéphane Chazelas

Nerede engelleyeceğini Linux'un aksine sistemler nelerdi (ya da bunlardı) mkfifo fifo; exec 3<>fifo?
Billy Amca
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.