2010-06-16 11 views
29

Şunun gibi bir şey düşünün:Aynı girdi dosyasını bir piped komutunun çıkışı olarak kullanmak uygun mu?

cat file | command > file 

Bu iyi uygulama mı? Bu, giriş dosyasını, okuduğumuz zamanla aynı şekilde yazabilir mi, yoksa her zaman önce bellekte okunduğunda, ikinci komuta aktarılıyor mu?

Açıkçası, geçici dosyaları geçici adım olarak kullanabilirim, ama sadece merak ediyorum ..

t=$(mktemp) 
cat file | command > ${t} && mv ${t} file 

cevap

44

Hayır, tamam değil. Bir boru hattındaki tüm komutlar aynı anda çalışır ve kabuk, komutları yürütmeden önce yönlendirmeleri hazırlar. Yani, kedinin onu okmadan önce komutun dosyanın üzerine yazması olasıdır.

Daha fazla yoldan sponge(1) gerekir.

+0

sayesinde! Aynı durum yeniden yönlendirme için de geçerlidir: 'komut < file > dosyası 'veya hatta işlem yerine koyma:' komut <(cat file) > dosya '? – Amro

+2

Evet, her iki durumda da geçerlidir. Kabuğun yönlendirmeleri herhangi bir düzende kurmakta serbest olduğunu unutmayın; dolayısıyla, aynı dosyaya tek bir komut veya boru hattında iki kez erişmek için tanımlanmamış davranışları düşünmelisiniz. Hatta bazen çalışır, garanti edilmez. – Juliano

3

Ayrıca (önerilmez üretim kodunda açık geçici dosyaları kullanın) böyle bir şey kullanabilirsiniz:

{ rm file && your_command > file; } < file 
0

Sadece sizin girişine çıktı yazmak içermemeli, ama aynı zamanda döngü kaçınmalıdır senin Girişinize geri dönün. Büyük dosyalarla uğraşırken

, ben

cat *allfastq30 > Sample_All_allfastq30 

çalıştı ve bu hata mesajları oluşturulan: moreutils çok faydalı görünüyor

cat: Sample_All_allfastq30: input file is output file 
İlgili konular