Pertanyaan Mengapa perintah grep ini tidak berfungsi?


Saat saya mencoba menggunakan grep dengan cara ini:

service --status-all | grep network

Ini masih daftar semua layanan meskipun saya memasukkannya ke dalam grep untuk membatasinya ke string "jaringan" saja


Setelah Fakta: 

Perhatikan ini artikel yang menjelaskan mengapa perintah berperilaku seperti ini, itulah yang saya sukai tentang linux, selalu ada alasan yang bagus, tetapi tidak perlu intuitif


23
2018-03-11 09:38


asal




Jawaban:


Mencoba:

service --status-all |& grep network

Aplikasi baris perintah dapat mencetak ke dua aliran teks yang dikenal sebagai standar keluar (stdout) dan kesalahan standar (stderr). Secara default, terminal hanya menampilkan output untuk keduanya secara identik.

Stdout diberi nomor 1, dan stderr diberi nomor 2. Secara default, operator redirection, suka >, | dan < berlaku hanya untuk stdout, nomor 1.

|& pipa keduanya stdout dan stderr bersama-sama ke proses pada aliran masukan standar kanan (stdin), yang membuatnya grep bekerja sesuai yang Anda harapkan.

Saya tidak tahu kenapa service --status-all mencetak ke stderr di sini, tetapi secara umum, memiliki aliran stderr terpisah sangat berguna, karena memungkinkan Anda melihat kesalahan bahkan ketika stdout dibungkam.


40
2018-03-11 09:43



Terima kasih atas jawabannya, sepertinya ini telah menghasilkan banyak minat. Jadi saya kira saya bukan satu-satunya dengan masalah ini. - Meer Borg


Anda perlu mengalihkan aliran kesalahan standar (2) ke keluaran standar (1):

service --status-all 2>&1 | grep network

Operator > biasanya mengarahkan ke file (mis. 2>/tmp/file). Untuk mengalihkan ke aliran lain menggunakan pendeskripsi, perlu didahului dengan & (perhatikan tidak ada spasi di antara karakter).


4
2018-03-14 20:44