Bash anlamı '2>> (command)' Yönlendirme


18

Bir süre önce bir senaryo hazırladım ve etrafına günlük kaydı ekledim, ancak günlük kaydı yönlendirmesinin nasıl çalıştığını unuttum :-(

Bunun özü:

#!/bin/bash

LOGFILE=/some/path/mylogfile

(
  # here go my commands which produce some stdout
  # and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )

Komut dosyasını çalıştırdığımda, hiçbir şey yazdırmıyor stdout, sadece gidenleri yazdırıyor stderr. Logfile ${LOGFILE}hem stdout hem de stderr'i yakalar.

Senaryoyu çalıştırdığımda ve terminalimde çıktı olmadığında, her şeyin yolunda olduğunu biliyorum. Herhangi bir çıktı varsa, bir şeylerin yanlış gittiğini biliyorum ve sorunun ne olduğunu bulmak için günlük dosyasını kontrol edebilirim.

Yeniden yönlendirmenin beni şaşırtan kısmı şu sözdizimidir: 2> >( some command )

Orada neler olduğunu açıklayan var mı?

Yanıtlar:


23

>(...)işlem ikamesi olarak adlandırılır . "Dış" programın "iç" programa bir dosyaymış gibi yazmasına izin verir.

Durumda yazıyor stderriçin tee -a ${LOGFILE} >&2eklenecek olan LOGFILEve daha sonra da yazma her şey geri stderr.

Yeniden yönlendirme operatörü, işlem ikamesi için her iki yöne de gidebilir, bu nedenle bu örnekte olduğu gibi ona yazabilir veya ondan <(...)okumak için kullanabilirsiniz ; bu, örneğin whilebir alt kabukta çalıştırmadan bir döngü yapmanın kullanışlı bir yoludur. kendisi.


5
Anladım :-) ben çalıştırırsak echo <(date), bana ikame dosyanın adını verir: /dev/fd/63. Ben yürütmek durumunda cat <(date), bu yani ikame dosyanın içeriği, bana tarihini veriyor: Fri Nov 18 14:11:09 NZDT 2016.
NZD

@NZD, evet - ama bunun normal bir dosya olduğunu hayal etmeyin - gördüğünüz /devişlemler arasındaki boru için bir isim.
Toby Speight

Bu teknik stderr borulanamayacağı için mi kullanılıyor ( teebu durumda)?
bli

@bli Evet, stdout zaten başka bir yere yönlendiriliyor, bu bana teestderr ve stdout'tan ayrı tutmanın en basit yolu gibi görünüyor .
Eric Renouf
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.