redirect ke / dev / null


144

Saya membaca contoh skrip bash shell:

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

# First remove the old bzip2 file.  Redirect errors because this generates some if the archive
# does not exist.  Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar

# Copy the file to another host - we have ssh keys for making this work without intervention.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> /home/franky/log/home_backup.log
echo backup succeeded >> /home/franky/log/home_backup.log

Saya mencoba memahami penggunaan "/ dev / null 2> & 1" di sini. Pada awalnya, saya pikir skrip ini menggunakan / dev / null untuk mengabaikan kesalahan dengan anggun, tanpa menyebabkan skrip crash (seperti mencoba menangkap penanganan pengecualian dalam bahasa pemrograman). Karena saya tidak melihat bagaimana menggunakan tar untuk mengkompres direktori menjadi file tar mungkin dapat menyebabkan segala jenis kesalahan.


3
Mengarahkan kembali ke /dev/nulltidak akan mencegah crash, tetapi akan membersihkan aliran output stdout dan stderr. tardapat menyebabkan kesalahan dalam berbagai cara. Anda mungkin tidak memiliki akses tulis, file mungkin sudah ada, dll.
Sparhawk

3
Hanya trik untuk menghindari hasil yang tidak perlu. Adapun mengapa tar dapat menyebabkan kesalahan: karena direktori target tidak ada, karena sumbernya tidak, karena Anda tidak memiliki akses tulis ke target, atau membaca ke sumber, karena tartidak ada dalam $ PATH Anda, karena tarlumpuh (Anda tidak pernah tahu), karena tidak ada ruang tersisa di perangkat, karena tarversi berubah dan sekarang memerlukan sintaks yang berbeda, karena disk menyebabkan kesalahan I / O. Saya yakin Anda bisa menemukan lebih banyak.
terdon

Jawaban:


223

Tidak, ini tidak akan mencegah skrip mogok. Jika ada kesalahan dalam tarproses (misalnya: izin ditolak, tidak ada file atau direktori, ...) skrip akan tetap macet.

Karena menggunakan > /dev/null 2>&1akan mengarahkan semua output perintah Anda (keduanya stdoutdan stderr) /dev/null, yang berarti tidak ada output yang dicetak ke terminal.

Secara default:

stdin  ==> fd 0
stdout ==> fd 1
stderr ==> fd 2

Dalam skrip, Anda menggunakan > /dev/nullmenyebabkan:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2

Dan kemudian 2>&1menyebabkan:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> stdout

3
Pada pemahaman > /dev/null 2>&1, perintah ini menghasilkan stderr ==> stdout, jadi stderr masih bisa dicetak ke stdout ??
Weishi Zeng

11
mungkin tidak terlalu penting, tetapi apa itu fd?
kev


7
Mengapa: CMD > /dev/null 2>&1bekerja tetapi CMD 2>&1 > /dev/nulltetap memberi saya STDERR?
dbmikus

3
Direkomendasikan: Gunakan 2>& 1dalam contoh kode untuk menekankan bahwa angka dan tanda dan dianggap sebagai bagian dari operator pengalihan. Adalah umum untuk pengalihan ke file untuk memiliki ruang di antara >dan /path/to/file, pengalihan ke deskriptor file pada dasarnya adalah hal yang sama.
Henk Langeveld

21

Saya mencoba memahami penggunaan "> / dev / null 2> & 1" di sini.

(perhatikan bahwa saya menambahkan pengalihan sebelumnya /dev/nulldalam pertanyaan Anda.)

Di atas akan mengarahkan STDOUTdan STDERRke /dev/null. Ini bekerja dengan menggabungkan STDERRke dalam STDOUT. (Pada dasarnya semua output dari perintah akan dialihkan ke perangkat nol .)

... tanpa menyebabkan skrip macet (seperti mencoba menangkap penanganan pengecualian dalam bahasa pemrograman).

Ini tidak seperti try/catchatau apa pun. Itu hanya membungkam segala jenis output (termasuk kesalahan) dari perintah.

Karena saya tidak melihat bagaimana menggunakan tar untuk mengkompres direktori menjadi file tar mungkin dapat menyebabkan segala jenis kesalahan.

Ini dapat menyebabkan kesalahan karena sejumlah alasan, termasuk:

  • Izin yang tidak memadai pada file yang Anda coba arsipkan atau pada file yang Anda coba tulis
  • Kurangnya ruang disk untuk membuat arsip

dijelaskan dengan baik.
Aditya Gupta

7

Ketika Anda menjalankan CMD> / dev / null 2> & 1

STDOUT mengalihkan ke / dev / null, dan kemudian STDERR mengalihkan ke ALAMAT STDOUT, yang telah diatur ke / dev / null, akibatnya baik STDOUT dan STDERR mengarah ke / dev / null

Sebaliknya, ketika Anda menjalankan CMD 2> & 1> / dev / null

STDERR mengalihkan ke ALAMAT STDOUT (File descriptor 1 pada saat itu, atau / proc / self / fd / 1), dan kemudian STDOUT mengalihkan ke / dev / null, tetapi STDERR terus mengarahkan ke fd1 !! Akibatnya output normal dari STDOUT dibuang, tetapi kesalahan yang berasal dari STDERR masih ditulis ke konsol.


-2

Pengalihan I / O Bash

Ide utama untuk membereskan semuanya adalah ini:

Pengalihan diterapkan dari KANAN ke KIRI, berlawanan dengan cara yang biasa digunakan penutur bahasa Inggris.


Jadi kode ini:

command > filename 2>&1

redirect stderrke stdout pertama ( 2>&1) dan kemudian mengirim stdout(termasuk yang diarahkan stderr) ke filename( > filename). Berikut adalah penjelasan ABSG (Bab 20) .

Kode ini:

command >>/dev/null 2>&1

pengalihan stderrdan stdoutke /dev/null... yang berarti ke mana - mana . Barang yang dikirim ke /dev/nulltidak disimpan, disimpan dalam cache, atau diingat dengan cara apa pun.

Mereka hanya dikirim ke ' tempat ' dan dilupakan. Ini adalah cara menjalankan program dan memastikan mereka tidak menghasilkan keluaran dan tidak akan pernah terlihat di baris perintah atau dalam file log.


Saya melihat jenis pertanyaan ini cukup sedikit ... terutama karena saya harus mencarinya sendiri karena saya belum pernah menulis kode selama bertahun-tahun. Berikut adalah beberapa informasi praktis dari ABSG:

"Pengalihan berarti menangkap output dari file, perintah, program, atau skrip dan mengirimkannya sebagai input ke file, perintah, program, atau skrip lain."

2>&1 
# Redirects stderr to stdout.

command >>filename 2>&1
# Appends both stdout and stderr
#+  to the file "filename" ...

ABSG: Lanjutan Bash Scripting Guide: The Bab 20 link di atas adalah link ke halaman redirection I / O dari open source tldp.org dokumen disebut Lanjutan Bash Scripting Guide oleh Mendel Cooper. Terdaftar sebagai "Eksplorasi mendalam tentang seni skrip shell" dan saya sangat setuju. Ini adalah sumber yang luar biasa dan memiliki banyak jawaban untuk semua jenis situasi gila.

Sumber Daya Berharga Lainnya: Ada banyak sumber daya berharga di bagian saat ini / dikelola (dalam beberapa format praktis seperti html, pdf, teks, dll) di halaman Panduan Proyek Dokumentasi Linux . Inilah beberapa yang menurut saya bermanfaat:


1
Tidak, pengalihan ditangani dari kiri ke kanan. Dalam contoh Anda, output standar dialihkan ke filename, maka kesalahan standar diarahkan ke mana pun output standar saat ini (ke filename). Jika sebaliknya, kesalahan standar akan berakhir di terminal sementara hanya output standar yang dialihkan ke filename. Juga, dalam command >file1 2>file2, file2tidak akan dibuat jika file1tidak dapat dibuat (tidak peduli apakah file1dan file2itu benar-benar nama path yang sama sekali berbeda).
Kusalananda
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.