GNU/Linux >> Belajar Linux >  >> Linux

Redirect Semua Stderr Perintah Selanjutnya Menggunakan Exec?

Saya memiliki file bash yang saya perlukan untuk mengarahkan semua output ke satu file, log debug serta ke terminal. Saya perlu mengarahkan stdout dan stderr ke debug dan mencatatnya untuk semua perintah dalam skrip.

Saya tidak ingin menambahkan 2>&1 | tee -a $DEBUG untuk setiap perintah dalam file. Saya bisa hidup dengan | tee -a $DEBUG .

Saya ingat ada cara untuk melakukannya dengan sesuatu seperti exec 2>&1 .

Saat ini saya menggunakan sesuatu seperti berikut:

#!/bin/bash
DEBUGLOG=/tmp/debug
exec 2>&1
somecommand | tee -a $DEBUGLOG
somecommand2 | tee -a $DEBUGLOG
somecommand3 | tee -a $DEBUGLOG

tapi itu tidak berhasil. Adakah yang punya solusi/bisa menjelaskan penyebabnya?

Jawaban yang Diterima:

Adapun solusi untuk mengarahkan banyak perintah sekaligus:

#!/bin/bash
{
    somecommand 
    somecommand2
    somecommand3
} 2>&1 | tee -a $DEBUGLOG

Mengapa solusi asli Anda tidak berfungsi:exec 2>&1 akan mengarahkan keluaran kesalahan standar ke keluaran standar shell Anda, yang, jika Anda menjalankan skrip dari konsol, akan menjadi konsol Anda. pengalihan pipa pada perintah hanya akan mengarahkan ulang output standar dari perintah tersebut.

Dari sudut pandang somecommand , output standarnya masuk ke pipa yang terhubung ke tee dan kesalahan standar masuk ke file/pseudofile yang sama dengan kesalahan standar shell, yang Anda arahkan ke output standar shell, yang akan menjadi konsol jika Anda menjalankan program dari konsol.

Satu-satunya cara yang benar untuk menjelaskannya adalah dengan melihat apa yang sebenarnya terjadi:

Lingkungan asli shell Anda mungkin terlihat seperti ini jika Anda menjalankannya dari terminal:

stdin -> /dev/pts/42
stdout -> /dev/pts/42
stderr -> /dev/pts/42

Setelah Anda mengarahkan kesalahan standar ke keluaran standar (exec 2>&1 ), Anda ... pada dasarnya tidak mengubah apa pun. Tetapi jika Anda mengarahkan output standar skrip ke file, Anda akan mendapatkan lingkungan seperti ini:

stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /dev/pts/42

Kemudian mengarahkan kesalahan standar shell ke output standar akan berakhir seperti ini :

stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /your/file

Menjalankan perintah akan mewarisi lingkungan ini. Jika Anda menjalankan perintah dan menyalurkannya ke tee, lingkungan perintah akan menjadi :

stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file

Jadi kesalahan standar perintah Anda masih masuk ke dalam apa yang digunakan shell sebagai kesalahan standarnya.

Terkait:${!FOO} dan zsh?

Anda sebenarnya dapat melihat lingkungan suatu perintah dengan melihat di /proc/[pid]/fd :gunakan ls -l untuk juga mencantumkan konten tautan simbolik. file di sini adalah input standar, 1 adalah keluaran standar dan 2 adalah kesalahan standar. Jika perintah membuka lebih banyak file (dan sebagian besar program melakukannya), Anda juga akan melihatnya. Sebuah program juga dapat memilih untuk mengalihkan atau menutup input/output standarnya dan menggunakan kembali , 1 dan 2 .


Linux
  1. Redirect semua output ke file di Bash

  2. Bagaimana cara menghapus semua file dalam folder, tetapi tidak menghapus folder menggunakan pustaka standar NIX?

  3. Redirect semua output ke file menggunakan Bash di Linux?

  1. Bagaimana Anda mengarahkan respons wget ke standar keluar?

  2. Bagaimana cara mematikan semua proses pengguna menggunakan UID mereka

  3. bash:redirect stderr ke file dan stdout + stderr ke layar

  1. Bagaimana Cara Mengarahkan Hanya Stderr?

  2. Bagaimana mengaudit semua Perintah yang dijalankan di OEL 5,6 menggunakan auditd

  3. Menangkap STDERR dan STDOUT ke file menggunakan tee