Kabul edilen cevap STDERR'ı ayrı bir dosya tanımlayıcı olarak korumaz. Bunun anlamı
./script.sh >/dev/null
çıkışı olmaz bar
terminaline, yalnızca kayıt dosyasına için ve
./script.sh 2>/dev/null
çıktısı hem foo
ve bar
terminaline. Açıkçası bu normal bir kullanıcının bekleyeceği davranış değildir. Bu, her ikisi de aynı günlük dosyasına eklenen iki ayrı tee işlemi kullanılarak düzeltilebilir:
#!/bin/bash
# See (and upvote) the comment by JamesThomasMoon1979
# explaining the use of the -i option to tee.
exec > >(tee -ia foo.log)
exec 2> >(tee -ia foo.log >&2)
echo "foo"
echo "bar" >&2
(Yukarıdakilerin günlük dosyasını kısaltmayacağını unutmayın - bu davranışı istiyorsanız eklemeniz gerekir
>foo.log
komut dosyasının en üstüne yerleştirin.)
Arasında POSIX.1-2008 özellikleritee(1)
bu çıkış tamponsuz olduğu gerektirir, yani bile satır tamponlu, nedenle STDOUT ve STDERR aynı satırda yer alabilir mümkündür, bu durumda foo.log
, Günlük dosyası ne sadık bir yansıması olacak böylece Ancak bu da, terminalde olabilirdi olabilirdi bunun tam ayna değilse terminal görülebilir. STDOUT satırlarının STDERR satırlarından temiz bir şekilde ayrılmasını istiyorsanız, daha sonra kronolojik yeniden birleştirmeye izin vermek için muhtemelen her satırda tarih damgası önekleri olan iki günlük dosyası kullanmayı düşünün.