Bagaimana saya bisa menekan semua output dari perintah menggunakan Bash?


296

Saya memiliki skrip Bash yang menjalankan program dengan parameter. Program itu mengeluarkan beberapa status (melakukan ini, melakukan itu ...). Tidak ada pilihan untuk program ini menjadi tenang. Bagaimana saya bisa mencegah skrip menampilkan sesuatu?

Saya mencari sesuatu seperti Windows ' "echo off" .

Jawaban:


510

Yang berikut ini mengirimkan output standar ke perangkat null (bit bucket).

scriptname >/dev/null

Dan jika Anda juga ingin pesan kesalahan dikirim ke sana, gunakan salah satu (yang pertama mungkin tidak berfungsi di semua shell):

scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null

Dan, jika Anda ingin merekam pesan, tetapi tidak melihatnya, ganti /dev/nulldengan file yang sebenarnya, seperti:

scriptname &>scriptname.out

Untuk kelengkapan, di bawah Windows cmd.exe (di mana "nul" setara dengan "/ dev / null"), itu adalah:

scriptname >nul 2>nul

8
Perhatikan bahwa '&>' khusus untuk bash (dan mungkin C shell); Kerang Korn dan Bourne membutuhkan 2> / dev / null atau 2> & 1 (untuk mengirim stderr ke tempat yang sama dengan stdout). Shell Korn tampaknya menafsirkan '&>' sebagai "jalankan barang sampai & di latar belakang, lalu lakukan pengalihan i / o pada perintah kosong".
Jonathan Leffler

2
Perhatikan bahwa beberapa perintah menulis langsung ke perangkat terminal daripada ke output / kesalahan standar. Untuk menguji, masukkan echo foo > $(tty)skrip dan jalankan ./test.sh &> /dev/null- Output masih dicetak ke terminal. Tentu saja ini bukan masalah jika Anda sedang menulis skrip yang tidak menggunakan perintah seperti itu.
l0b0

1
@ l0b0, apakah ada cara untuk membuat tty script (atau program lain) berbeda sehingga semua output dialihkan terlepas dari contoh Anda? Saya tahu layar dan skrip dapat melakukan sesuatu seperti itu tetapi keduanya rewel dan bervariasi dari * nix ke * nix.
Brent

@yang /dev/nullada di Cygwin, Anda tidak perlu menggunakan nul.
dimo414,

47

Sesuatu seperti

script > /dev/null 2>&1

Ini akan mencegah output standar dan output kesalahan, mengarahkan keduanya ke /dev/null.


5
Juga dicapai hanya dengan &> jika Anda ingin menyimpan beberapa pengetikan;)
andynormancx

1
Meskipun saya menambahkan ini ke perintah gs (GhostScript) saya, masih mencetak **** Peringatan: File memiliki marker %% EOF yang rusak, atau sampah setelah %% EOF. Ada saran?
ZurabWeb

Ini tidak menjalankan proses pada sistem unix, saya harus lakukan2>/dev/null
alper

13

Mencoba

: $(yourcommand)

: kependekan dari "do nothing".

$() hanya perintahmu.


3
Sangat menarik tetapi ada batasan: kode status yang dikembalikan selalu 0(sukses). Mari kita lihat contoh menggunakan perintah falseyang selalu kembali 1(gagal). Misalnya ( echo foo | tee file ; false ) && echo barmenampilkan foo. Menggunakan trik Anda untuk menekan output: ( : $(echo foo | tee file ; false) ) && echo bar. Tapi ini menampilkan barartinya kode status pengembalian 0(ini bukan kode status yang dikembalikan dari false). Harap perbarui jawaban Anda dengan memberikan batasan ini. Cheers
olibre

2
@ Colibre, bagaimana DUMMY=$(yourcommand)? Itu tidak memiliki batasan yang telah Anda sebutkan. :)
semente

3
@semente Perfect: Perintah DUMMY=$( echo foo | tee file ; false ) && echo bartidak menampilkan apa pun. Dan perintahnya DUMMY=$( echo foo | tee file ; true ) && echo barditampilkan bar. Beri tahu saya jika Anda memberikan jawaban untuk meningkatkannya ;-) Cheers
olibre

9

Alternatif yang mungkin cocok dalam beberapa situasi adalah dengan menetapkan hasil perintah ke variabel:

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

Karena Bash dan penerjemah baris perintah POSIX lainnya tidak menganggap penugasan variabel sebagai perintah, kode pengembalian perintah ini dihormati.

Catatan: penetapan dengan typesetatau declarekata kunci dianggap sebagai perintah, jadi kode pengembalian yang dievaluasi dalam kasus adalah penetapan itu sendiri dan bukan perintah yang dijalankan di sub-shell:

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0

6

Suka posting andynormancx , gunakan ini (jika Anda bekerja di lingkungan Unix):

scriptname > /dev/null

Atau Anda dapat menggunakan ini (jika Anda bekerja di lingkungan Windows):

scriptname > nul

1
Anda sebenarnya dapat melakukan lebih baik dari itu di shell Windows. Jika sebaliknya Anda menggunakan "scriptname> nul" maka Anda bahkan tidak akan memiliki file untuk dihapus, karena "nul" adalah setara dengan Windows dari / dev / null.
andynormancx

1
@ andynormancx: Itulah yang saya benci tentang tata letak sistem file Windows. Itu "cadangan" nama file seperti NUL, COM1, LPT1, CON, dll, tidak peduli apa direktori Anda berada (bahkan jika Anda berada di sistem file yang dapat memiliki nama file tersebut, seperti di jaringan berbagi).
dreamlax

Saya tidak berpikir saya sudah benar-benar menggunakan NUL sejak DOS 5.x, tiba-tiba mengingat ketika saya melihat jawaban ini;)
andynormancx

Jika Anda menggunakan > nulWindows dengan cygwin atau git bash dan sekarang Anda terjebak dengan nulfile yang tidak dapat dihapus, tolong coba jawaban ini , itu berfungsi seperti pesona.
Daemon Painter

4

Lihatlah contoh ini dari Proyek Dokumentasi Linux :

3,6 Contoh: stderr dan stdout 2 file

Ini akan menempatkan setiap output program ke file. Ini kadang-kadang cocok untuk entri cron, jika Anda ingin perintah lewat tanpa suara.

     rm -f $(find / -name core) &> /dev/null 

Yang mengatakan, Anda dapat menggunakan pengalihan sederhana ini:

/path/to/command &>/dev/null

1

Dalam skrip Anda, Anda dapat menambahkan yang berikut ke baris yang Anda tahu akan memberikan hasil:

some_code 2>>/dev/null

Atau Anda juga bisa mencoba

some_code >>/dev/null

1
tidak pernah melihat >> ke / dev / null .. karena penasaran .. Mengapa Anda melakukan ini?
Florian Berndl

Apakah ini menekan semua output?
Peter Mortensen

Mengapa dobel ">" ( >>)?
Peter Mortensen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.