katran boruya ama -v ayrıntılı çıktıyı STDERR'dan ayrı tut


12

Normal bir katran komutu

tar cvf foo.tar ./foo >foo.out 2>foo.err

üç çıkış G / Ç akışı vardır

  • verileri foo.tar'a arşivle
  • STDOUT dosya adlarının listesi (foo.out'a yönlendirilir)
  • hata iletileri STDERR (foo.err dosyasına yönlendirilir)

Sonra dosya adları listesini okumak zorunda kalmadan foo.err hata iletileri için inceleyebilirsiniz.

arşiv verileriyle bir şey yapmak istersem (netcat veya özel bir sıkıştırma programı aracılığıyla aktarın) tar'ın -f -seçeneğini kullanabilirim

tar cvf - ./foo 2>foo.err | squish > foo.tar.S

Ama şimdi dosya adları listem hata mesajımla karışıyor çünkü tar'ın -vçıktısı açıkça STDOUT'a (arşiv verilerinin aktığı yer) gidemiyor, bu yüzden tar bunu akıllıca STDERR'a yazıyor.

Korn kabuğunu kullanmak, arşiv akışını başka bir komuta bağlayan, ancak yine de -vçıktıyı herhangi bir hata mesajından ayrı olarak yakalayan bir komut oluşturmanın bir yolu var .


Aşina mısın tee? Bu oldukça geçerli bir kullanım durumu gibi görünüyor.
HalosGhost

Yanıtlar:


9

Sisteminiz destekliyorsa /dev/fd/n:

tar cvf /dev/fd/3 ./foo 3>&1 > foo.out 2>foo.err | squish > foo.tar.S

AT&T uygulamaları ile ksh(veya bashveya zsh) süreç ikamesi kullanarak yazabilirsiniz :

tar cvf >(squish > foo.tar.S) ./foo > foo.out 2>foo.err

Bu, bu sefer dışında tamamen aynı şeyi yapıyor, kabuk yerine hangi dosya tanımlayıcısının kullanılacağına karar veriyor 3(genellikle 9'un üstünde). Başka bir fark, bu sefer tarbunun yerine çıkış durumunu almanızdır squish. Desteklemeyen sistemlerde /dev/fd/n, bazı kabuklar bu özellik için adlandırılmış borulara başvurabilir.

Sisteminiz desteklemiyorsa /dev/fd/nveya kabuğunuz, işlem değişikliği için adlandırılmış borulardan yararlanamıyorsa, adlandırılmış borularla elle uğraşmanız gereken yer burasıdır .


6

Bunun için adlandırılmış bir boru kullanmanız gerekir.

İlk olarak klasörde bir tane oluşturun:

mkfifo foo.pipe

Ardından şu komutu kullanın:

tar cvf foo.pipe ./foo >foo.out 2>foo.err & cat foo.pipe >foo.tar

Uyarı:cat -part, şimdi de olabilir gzipveya borusundan okuyabileceği ne olursa olsun,:

tar cvf foo.pipe ./foo >foo.out 2>foo.err & gzip -c foo.pipe >foo.tar

Açıklama:

Çıkış adı borusunun (yazılır foo.pipebir proccess () cat, gzip, netcat) okur. Bilgi için stdout / stderr kanallarını kaybetmezsiniz.


1
Adlandırılmış bir boru kullanmanın etkilerini belirtmeye değer olabilir . 1) en iyisi, umask 077diğer işlemlerin ona okunmasını veya yazılmasını önlemek için bir (veya özel geçici dizin kullanmak) ayarlamaktır (birçok sistemde, adlandırılmış borular, diğer dosyalar varsayılan olarak dünya tarafından okunabilir olarak oluşturulur), 2) adlandırılmış kanal yalnızca komut dosyanızın her örneği tarafından kullanılır (yine bir kerelik özel geçici dizin yardımcı olur) 3) Bu, daha sonra veya kesintiye uğramanız durumunda temizlemeniz gerektiği anlamına gelir.
Stéphane Chazelas

1
+1 - Bu yanıtı beğendim. Ne yazık ki benim için, (eski) sistemimdeki adlandırılmış borularda bunu denediğimde onları güvenilmez kılan bir tuhaflık var.
RedGrittyBrick

1
@ StéphaneChazelas - Sanırım bazen temizlemek daha kolay olabilir, örneğin:p="/tmp/pipe$$"; mkfifo "$p"; (read na; cmd[s]...) <>"$p" & (echo;rm "$p"; cmd[s]...) >"$p"
mikeserv

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.