Bagaimana cara membungkam output dalam skrip Bash?

149

Saya memiliki program yang menampilkan ke stdout dan ingin membungkam keluaran itu dalam skrip Bash sambil memipis ke file.

Misalnya, menjalankan program akan menampilkan:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

Saya ingin skrip berikut tidak menampilkan apa pun ke terminal:

#!/bin/bash
myprogram > sample.s
Sam
sumber
Dari apa yang saya ingat, pengalihan output ke file menyebabkannya tidak digaungkan ke terminal. Apa yang tidak bekerja untukmu?
Anon.
serverfault.com/questions/41964/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功 法轮功

Jawaban:

187

Jika output ke stderr juga Anda ingin membungkamnya. Anda dapat melakukannya dengan mengarahkan file deskriptor 2:

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null
John Kugelman
sumber
15
Baris "&>" adalah versi lebih pendek dari apa yang baru saja saya posting. Saya belum pernah menemukan jalan pintas itu sebelumnya. Upvoting.
chradcliffe
5
&>jauh lebih tua daripada bash 4.
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams Bisakah Anda menghubungkan tautan &>pengantar dokumentasi changelog ? : o
ThorSummoner
1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 menunjukkan bahwa >>&diperkenalkan pada 4.0. Tidak disebutkan &>tetapi PERUBAHAN hanya kembali ke 2.0 jadi saya pikir itu berarti sudah di 1.x.
tripleee
git blamepada redir.cpoin ke komit 1998 untuk kejadian tertua masih dalam basis kode saat ini.
tripleee
60

Redirect stderr ke stdout

Ini akan mengarahkan stderr (yang merupakan deskriptor 2) ke file deskriptor 1 yang merupakan stdout.

2>&1

Redirect stdout ke File

Sekarang ketika melakukan ini, Anda mengarahkan stdout ke file sample.s

myprogram > sample.s

Redirect stderr dan stdout ke File

Menggabungkan dua perintah akan menghasilkan pengalihan stderr dan stdout ke sample.s

myprogram > sample.s 2>&1

Arahkan ulang stderr dan stdout ke / dev / null

Arahkan ke /dev/nulljika Anda ingin benar-benar mematikan aplikasi Anda.

myprogram >/dev/null 2>&1
Debugger
sumber
13
Yang terakhir tidak memiliki operator pengalihan; seharusnya myprogram >/dev/null 2>&1(perhatikan irisan sebelum /dev/nulldan urutan pengalihan).
tripleee
2
tidak myprogram &>/dev/nullakan cukup?
JaviOverflow
38

Semua output:

scriptname &>/dev/null

Portabel:

scriptname >/dev/null 2>&1

Portabel:

scriptname >/dev/null 2>/dev/null

Untuk pesta yang lebih baru (tidak portabel):

scriptname &>-
Eduardo Cuomo
sumber
Ini tidak berhasil. Ini sebenarnya membuat file bernama -dan &>merupakan ekstensi bourne shell non-portabel.
PhilT
Setara portabel echo moo 1>&-menghasilkan kesalahan karena file descriptor 1 ditutup:-bash: echo: write error: Bad file descriptor
tripleee
11

Jika Anda ingin STDOUT dan STDERR [semuanya], maka cara paling sederhana adalah:

#!/bin/bash
myprogram >& sample.s

kemudian jalankan seperti ./script , dan Anda tidak akan mendapatkan output ke terminal Anda. :)

"> &" berarti STDERR dan STDOUT. yang &juga bekerja dengan cara yang sama dengan pipa: ./script |& sed yang akan mengirimkan segalanya untuk sed

Mat
sumber
7
man bash (di bawah "Mengarahkan Output Standar dan Kesalahan Standar") mengatakan &> dan> & adalah sama tetapi yang pertama (&>) lebih disukai. Namun | & adalah satu-satunya cara untuk melakukan ini untuk pipa.
John Mellor
1
@ John Tidak, cara portabel untuk pipa adalaha 2>&1 | b 2>&1 | c
tripleee
9

Jika Anda masih kesulitan untuk menemukan jawaban, khususnya jika Anda menghasilkan file untuk output, dan Anda lebih suka alternatif yang jelas: echo "hi" | grep "use this hack to hide the oputut :) "

Henry H.
sumber
2
Retasan menarik ... upvoting untuk kepintaran ^ _ ^
skplunkerin
4

Coba dengan:

myprogram &>/dev/null

untuk tidak mendapatkan output

Swathi
sumber
0

Catatan: Jawaban ini terkait dengan pertanyaan "Cara mematikan gema saat menjalankan shell script Linux" yang pada gilirannya ditandai sebagai duplikat untuk yang ini.

Untuk benar-benar mematikan gema perintahnya adalah:

stty -echo

(Ini, misalnya; ketika Anda ingin memasukkan kata sandi dan Anda tidak ingin itu bisa dibaca. Ingat untuk mengaktifkan gema di akhir skrip Anda, jika orang yang menjalankan skrip Anda tidak akan melihat apa yang dia / Dia mengetik sejak saat itu. Untuk menghidupkan gema saat dijalankan:

gema stty

Berni
sumber
0

Berguna dalam skrip:


Dapatkan hanya STDERR dalam file, sambil menyembunyikan STDOUT apa pun meskipun program untuk menyembunyikan tidak ada sama sekali (tidak pernah menggantung skrip induk), ini saja berfungsi:

stty -echo && ./programMightNotExist 2> errors.log && stty echo

Lepaskan sepenuhnya dan tutup mulut semuanya, bahkan membunuh skrip induk tidak akan dibatalkan ./prog:

 ./prog </dev/null >/dev/null 2>&1 &
NVRM
sumber
0

Untuk output hanya pada kesalahan :

jadi [perintah]

Logo

Alberto Salvia Novella
sumber