Neden bazı Linux programlarının çıktısı STDOUT ya da STDERR'a gitmiyor?
Aslında, hangi “akışı” kullanırsa kullansın, tüm program çıktılarını nasıl güvenilir bir şekilde yakalayacağımı bilmek istiyorum. Sahip olduğum sorun, bazı programların çıktılarının yakalanmasına izin vermiyor gibi görünmesi.
Bir örnek 'time' komutu:
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
veya
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
Neden çıktıyı iki kere görüyorum? Her şeyin / dev / null'a aktarılmasını bekledim .
Hangi çıkış akımı zaman kullanıyor ve onu bir dosyaya nasıl aktarabilirim?
Bu sorunu çözmenin bir yolu , örneğin combine.sh
bu komutu içeren bir Bash betiği oluşturmaktır :
$@ 2>&1
Daha sonra 'zaman' çıktısı doğru şekilde yakalanabilir:
combine.sh time sleep 1 &> /dev/null
(çıktı yok - doğru)
Ayrı bir birleştirme komut dosyası kullanmadan istediğimi elde etmek için bir yolu var mı?
2>&1 > /dev/null
2 şimdi (varsayılan olarak, yani terminali) 1 gittiği yere gider" demektir ve ardından 1 şimdi gider için / dev / null (ancak 2 hala terminali gider!) kullanın.>/dev/null 2>&1
söylemek Msgstr "" 1 şimdi / dev / null 'a gider, sonra 2 1' in olduğu yere (yani / dev / null 'a) gider. Yerleşik 'zaman' yönlendirilmeyeceği için bu hala burada çalışmayacak, ancak daha genel olarak doğru (örneğin, / usr / bin / time kullanırsanız işe yarar). 1 gidiş 2 içine 1'ler "yönünü" kopyalama, değil 2 olarak düşünün "2> & 1"