Bunu yapmaya çok alışmıştım:
someprogram >output.file
Bir programın bir dosyaya oluşturduğu çıktıyı kaydetmek istediğimde bunu yapıyorum. Bu GÇ yönlendirmesinin iki çeşidinin de farkındayım :
someprogram 2>output.of.stderr.file
(stderr için)someprogram &>output.stderr.and.stdout.file
(her iki stdout + stderr için birleştirilmiş)
Bugün mümkün olmadığını düşündüğüm bir durumla karşılaştım. Aşağıdaki komutu kullanıyorum xinput test 10
ve beklendiği gibi aşağıdaki çıktıya sahibim:
user @ hostname: ~ $ xinput testi 10 30 tuşuna basın anahtar açma 30 tuşa basma 40 tuş açıklaması 40 tuşa basma 32 tuş açıklaması 32 tuşa basma 65 anahtar açma 65 tuşa basma 61 tuş açıklaması 61 tuşa basma 31 ^ Cı kullanıcı @ hostname: ~ $
Bu çıkışın her zamanki gibi bir dosyaya kaydedilebileceğini tahmin ettim xinput test 10 > output.file
. Ancak beklentime aykırı olduğunda output.file dosyası boş kalır. Bu aynı zamanda xinput test 10 &> output.file
stdout veya stderr'deki bir şeyi kaçırmadığımdan emin olmak için de geçerlidir .
Gerçekten kafam karıştı ve bu nedenle xinput
programın çıktısının yeniden yönlendirilmesini engellemenin bir yolu olup olmadığını soruyorum.
Güncelleme
Kaynağa baktım. Çıkışın bu kod tarafından üretildiği anlaşılıyor (aşağıdaki kod parçasına bakın). Bana göre çıktı sıradan bir printf tarafından üretilecek.
// test.c dosyasında statik boşluk print_events (Ekran * dpy) { XEvent Olayı; (1) { XNextEvent (dpy, ve Olayı); // [... burada diğer bazı etkinlik türleri burada gösteriliyor ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { int döngü; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Olay; printf ("anahtar% s% d", (Event.type == key_release_type)? "yayın": "basın", tuş-> tuş kodu); için (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + döngü, key-> axis_data [loop]); } Printf ( "\ n"); } } }
Kaynağı değiştirdim (aşağıdaki sonraki kod parçasına bakın), bu da stderr'deki çıktının bir kopyasını almama izin veriyor. Bu çıktı yönlendirebilirim:
// test.c dosyasında statik boşluk print_events (Ekran * dpy) { XEvent Olayı; (1) { XNextEvent (dpy, ve Olayı); // [... burada diğer bazı etkinlik türleri burada gösteriliyor ...] if ((Event.type == key_press_type) || (Event.type == key_release_type)) { int döngü; XDeviceKeyEvent * key = (XDeviceKeyEvent *) & Olay; printf ("anahtar% s% d", (Event.type == key_release_type)? "yayın": "basın", tuş-> tuş kodu); fprintf (stderr, "anahtar% s% d", (Event.type == key_release_type)? "yayın": "basın", tuş-> tuş kodu); için (loop = 0; loopaxes_count; loop ++) { printf ("a [% d] =% d", key-> first_axis + döngü, key-> axis_data [loop]); } Printf ( "\ n"); } } }
Şu andaki fikrim, belki de yönlendirme yaparak, programın, tuşa basma tuş açma olaylarını izleme yeteneğini kaybettiğidir.