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 output kesalahan standar ke output standar shell Anda, yang, jika Anda menjalankan skrip Anda dari konsol, akan menjadi konsol Anda. pengalihan pipa pada perintah hanya akan mengarahkan output standar dari perintah.
Pada sudut pandang somecommand
, output standarnya masuk ke pipa yang terhubung 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 Anda 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 output standar ( exec 2>&1
), Anda ... pada dasarnya tidak mengubah apa pun. Tetapi jika Anda mengarahkan output skrip standar ke file, Anda akan berakhir dengan 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 mengirimkannya ke tee, lingkungan perintahnya adalah:
stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file
Jadi kesalahan standar perintah Anda masih mencakup apa yang digunakan shell sebagai kesalahan standarnya.
Anda benar-benar dapat melihat lingkungan perintah dengan melihat /proc/[pid]/fd
: gunakan ls -l
juga untuk membuat daftar konten tautan simbolik. The 0
File sini adalah standar input, 1
output standar dan 2
standar error. Jika perintah membuka lebih banyak file (dan sebagian besar program melakukannya), Anda juga akan melihatnya. Suatu program juga dapat memilih untuk mengalihkan atau menutup input / output standar dan menggunakan kembali 0
, 1
dan 2
.
|&
berfungsi sebagai jalan pintas2>&1 |
, setidaknya sedikit lebih nyaman.