Linux lebih sedikit perilaku dan stderr

11

Saya menonton output dari perintah saya yang rumit dengan less, masalahnya adalah stderrhilang. stderrbaris biasanya terdaftar di antara stdoutbaris di dalam less. Saya ingin mereka dicetak di konsol, dan ketika saya keluar less, untuk melihatnya bersama-sama.

Saya menyadari mungkin ada ada solusi untuk ini, saya membaca tentang teedan multiteetapi tidak berhasil sejauh ini.

haelix
sumber
2
Anda memberi tahu saya cara mengarahkan stderr ke stdout tapi bukan itu yang saya inginkan. Saya tidak ingin stderr mencampur dengan stdout di dalam kurang. Saya ingin stderr berada di terminal saat saya keluar lebih sedikit.
Jika stderrdialihkan ke stdout, semua output stderr akan dicampur dengan output normal aktif stdout. Memipipkan output tersebut ke yang lessakan menampilkan keduanya.
Beberapa programmer Bung
Jika saya mengabaikan "stderr berada di terminal ketika saya keluar kurang", saya sarankan untuk menekan Ctrl-L lessuntuk mengecat ulang layar.
kamae

Jawaban:

10

Mungkin

command 2> command.err | less; cat command.err; rm command.err

Tambahan

Berikut ini klarifikasi untuk orang-orang yang lalai untuk membaca pertanyaan dengan hati - hati dan yang tidak membaca komentar klarifikasi OP di atas.

haelix menunjukkan:

garis stderr biasanya masuk dalam daftar di antara garis stdout dalam kurang

dan, dalam komentar untuk penjawab awal, menulis:

Anda memberi tahu saya cara mengarahkan stderr ke stdout tapi bukan itu yang saya inginkan. Saya tidak ingin stderr mencampur dengan stdout di dalam kurang. Saya ingin stderr berada di terminal saat saya keluar lebih sedikit

Masalahnya mungkin platform spesifik, itu pasti sesuatu yang saya alami pada platform Unix SVR4 yang lebih lama.

Jika, pada platform seperti itu, Anda melakukan sesuatu seperti

 find / ... | less

pesan kesalahan (mis. izin direktori) muncul seperti ini kurang

 stdout line 1
 stdout line 2
 error message text
 stdout line 4

sehingga garis keluaran dikaburkan oleh pesan kesalahan.

Jika Anda me-refresh halaman, garis output ditampilkan dengan benar tetapi Anda kehilangan pesan kesalahan. Ketika Anda keluar lebih sedikit layar dibersihkan kecuali untuk prompt perintah.

Jika Anda melakukan sesuatu seperti

  find / ... 2>&1 | less

Pesan-pesan kesalahan bercampur dengan output standar. Sekali lagi ketika Anda keluar lebih sedikit, layar kosong.

Jika Anda ingin pertama hanya meneliti keluaran standar dalam waktu kurang, kemudian melihat pesan kesalahan setelah keluar lebih sedikit, Anda memerlukan solusi yang berbeda.

Itulah yang secara tentatif saya sarankan dalam jawaban saya yang asli, dua baris.

RedGrittyBrick
sumber
Ini sampah. Jawaban Joachim yang seharusnya diterima.
Vanilla Face
2
@VanillaFace: Saya telah menambahkan beberapa materi klarifikasi pada jawaban saya.
RedGrittyBrick
15

Anda harus mengarahkan ulang stderrke stdout:

$ ./somecommad 2>&1 | less

Periksa manual untuk Anda shell (mis man bash.)

Beberapa programmer Bung
sumber
1
Komentar untuk pembaca baru dari pertanyaan lama ini (bukan untuk Joachim khususnya) Inilah yang dipikirkan oleh semua orang saat pertama kali memindai pertanyaan. Tetapi masalahnya lebih halus - lihat diskusi dalam komentar setelah jawaban dmckee
RedGrittyBrick
1

katakan saja shell untuk mengarahkan ulang fd 2 ke fd 1 (stderr ke stdout)

 make 2>&1 | less
jackdoe
sumber
1

Satu hal yang kurang dari semua jawaban sejauh ini adalah alasannya, mengapa ini terjadi. Masalahnya di sini adalah semacam ras-kondisi antara proses mengeluarkan barang ke stderrdan lessmenampilkan keluaran dari stdoutpada terminal. Jika lessmulai menampilkan setelah semua output stderrtelah dicetak ke terminal, maka lessakan mempertahankan itu dan Anda dapat melihat pesan setelah keluar less. OTOH jika lesssudah mulai menampilkan hal-hal, maka pesan kesalahan bercampur dengan lessoutput dan tidak ada yang dipertahankan setelah lesskeluar (karena lesshanya mempertahankan terminal seperti sebelum dimulai dan tidak tahu apa-apa tentang pesan kesalahan yang datang di antara).

Anda dapat melihatnya dengan mudah, jika Anda melakukan mis

grep foo -r /etc | less

Semua pesan kesalahan "Izin ditolak" bercampur dengan lessoutput dan tidak ada yang akan ada setelah Anda keluar. Jika kamu melakukan

grep foo -r /etc | (sleep 10; less)

semua (atau paling tidak sebagian besar) dari pesan kesalahan telah dicetak ke terminal sebelum lessmendapat kesempatan untuk menampilkan keluaran dan Anda akan melihat pesan kesalahan sesudahnya.

Tentu saja, Anda biasanya tidak ingin menunggu 10 detik sebelum mulai less, tetapi dengan Linux Anda juga dapat menyediakan nilai fraksional untuk waktu tunggu, dan dengan proses yang berjalan cepat sering sesedikit mungkin sleep 0.1untuk menghindari kondisi balapan. (Tapi, tentu saja, jika Anda ingin atau harus berada di sisi yang benar - benar aman, gunakan solusi RedGrittyBrick).

Elmar Zander
sumber
0

Anda perlu memahami konsep "deskriptor file". Biasanya, aplikasi unix akan mulai dengan tiga deskriptor file khusus:

  • Input standar
  • Output standar
  • Kesalahan standar

"Pipa" |di shell menghubungkan stdoutdari satu proses dengan proses stdinselanjutnya.

Kesalahan - menurut desain - tidak diumpankan ke stdinproses selanjutnya. Mereka akan sering tidak masuk akal untuk aplikasi berikutnya, dan tidak boleh disembunyikan dari pengguna.

Jika Anda ingin mencampur kesalahan menjadi stdout, Anda dapat menggunakan mis 2>&1, yang pada dasarnya mengatakan "append stderr to stdout". Sebagai contoh

find /etc 2>&1 | less

juga harus menyertakan output kesalahan dari file yang tidak dapat diakses.

find /etc 2>&1 >/dev/null | less

hanya akan memberi Anda kesalahan.

Memiliki QUIT - Anony-Mousse
sumber
0

Saya bingung tentang pertanyaan Anda, sejauh yang saya tahu perilaku yang Anda inginkan adalah default.

Saat saya gunakan

#include <stdio.h>

int main(int argc, char**argv){
  for (int j=0; j<10; ++j){
    fprintf( (j%2 ? stdout : stderr) , "%d\n" , j);
  }
  return 0;
}

untuk mendapatkan tes sederhana,

$ ./testredirection | less

tidak hanya apa yang Anda minta. Begitu ya

1
3
5
7
9
(END) 

di lessdan

$ ./testredirection | less
0
2
4
6
8
$ 

ketika saya berhenti less

dmckee --- mantan kucing moderator
sumber
Aneh, tetapi hal-hal tidak selalu seperti ini. Coba dengan skrip ( echo info ; echo error 1>&2) dan ulangi tes: kedua baris disalurkan menjadi kurang.
cYrus
@ cYrus: Itu berfungsi seperti yang diharapkan untuk saya juga. 'Tentu saja saya mencoba masuk pada kotak Mac OS. Bash 3.2.17, kurang 394. Mungkin sesuatu yang spesifik linux. Bagaimanapun, pendekatan RedGrittyBrick harus bekerja dengan baik.
dmckee --- ex-moderator kitten
Aneh! Debian Squeeze / Bash 4.1.5 / Kurang 436
cYrus
Ya, saya membuka cangkang kotak Scientific Linux 5.3 di tempat kerja dan mendapatkan perilaku yang diharapkan dengan bash 3.0.15 dan kurang dari 382. Bisakah ada regresi di sana?
dmckee --- ex-moderator kitten
Saya tidak tahu, saya pikir itu hanya masalah buffering.
cYrus
0

Saya kebetulan mengalami masalah ini di salah satu Debian 5.0 saya baru-baru ini. misalnya, ls abc | sedikit saya menemukan bahwa pesan kesalahan masuk ke kurang, yang bertentangan dengan pengetahuan saya.

Setelah beberapa upaya, saya menemukan bahwa itu hanya sesuatu yang terkait dengan penyangga layar. stderr TIDAK masuk ke kurang sebenarnya. Anda dapat menggunakan tombol panah Atas atau Bawah (atau j / k) untuk menunjukkan.

Berry
sumber