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.
bash-script
null
JohnMerlino
sumber
sumber
/dev/null
tidak akan mencegah crash, tetapi akan membersihkan aliran output stdout dan stderr.tar
dapat menyebabkan kesalahan dalam berbagai cara. Anda mungkin tidak memiliki akses tulis, file mungkin sudah ada, dll.tar
tidak ada dalam $ PATH Anda, karenatar
lumpuh (Anda tidak pernah tahu), karena tidak ada ruang tersisa di perangkat, karenatar
versi berubah dan sekarang memerlukan sintaks yang berbeda, karena disk menyebabkan kesalahan I / O. Saya yakin Anda bisa menemukan lebih banyak.Jawaban:
Tidak, ini tidak akan mencegah skrip mogok. Jika ada kesalahan dalam
tar
proses (misalnya: izin ditolak, tidak ada file atau direktori, ...) skrip akan tetap macet.Karena menggunakan
> /dev/null 2>&1
akan mengarahkan semua output perintah Anda (keduanyastdout
danstderr
)/dev/null
, yang berarti tidak ada output yang dicetak ke terminal.Secara default:
Dalam skrip, Anda menggunakan
> /dev/null
menyebabkan:Dan kemudian
2>&1
menyebabkan:sumber
> /dev/null 2>&1
, perintah ini menghasilkanstderr ==> stdout
, jadi stderr masih bisa dicetak ke stdout ??fd
?CMD > /dev/null 2>&1
bekerja tetapiCMD 2>&1 > /dev/null
tetap memberi saya STDERR?2>& 1
dalam 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.(perhatikan bahwa saya menambahkan pengalihan sebelumnya
/dev/null
dalam pertanyaan Anda.)Di atas akan mengarahkan
STDOUT
danSTDERR
ke/dev/null
. Ini bekerja dengan menggabungkanSTDERR
ke dalamSTDOUT
. (Pada dasarnya semua output dari perintah akan dialihkan ke perangkat nol .)Ini tidak seperti
try/catch
atau apa pun. Itu hanya membungkam segala jenis output (termasuk kesalahan) dari perintah.Ini dapat menyebabkan kesalahan karena sejumlah alasan, termasuk:
sumber
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.
sumber
Pengalihan I / O Bash
Ide utama untuk membereskan semuanya adalah ini:
Jadi kode ini:
redirect
stderr
kestdout
pertama (2>&1
) dan kemudian mengirimstdout
(termasuk yang diarahkanstderr
) kefilename
(> filename
). Berikut adalah penjelasan ABSG (Bab 20) .Kode ini:
pengalihan
stderr
danstdout
ke/dev/null
... yang berarti ke mana - mana . Barang yang dikirim ke/dev/null
tidak 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."
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:
sumber
filename
, maka kesalahan standar diarahkan ke mana pun output standar saat ini (kefilename
). Jika sebaliknya, kesalahan standar akan berakhir di terminal sementara hanya output standar yang dialihkan kefilename
. Juga, dalamcommand >file1 2>file2
,file2
tidak akan dibuat jikafile1
tidak dapat dibuat (tidak peduli apakahfile1
danfile2
itu benar-benar nama path yang sama sekali berbeda).