Saya ingin membuat skrip Bash saya lebih elegan untuk pengguna akhir. Bagaimana cara menyembunyikan output saat Bash menjalankan perintah?
Misalnya, saat Bash dijalankan
yum install nano
Berikut ini akan ditampilkan kepada pengguna yang mengeksekusi Bash:
Loaded plugins: fastestmirror
base | 3.7 kB 00:00
base/primary_db | 4.4 MB 00:03
extras | 3.4 kB 00:00
extras/primary_db | 18 kB 00:00
updates | 3.4 kB 00:00
updates/primary_db | 3.8 MB 00:02
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nano.x86_64 0:2.0.9-7.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
nano x86_64 2.0.9-7.el6 base 436 k
Transaction Summary
================================================================================
Install 1 Package(s)
Total download size: 436 k
Installed size: 1.5 M
Downloading Packages:
nano-2.0.9-7.el6.x86_64.rpm | 436 kB 00:00
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]>
Package: centos-release-6-4.el6.centos.10.x86_64 (@anaconda-CentOS-201303020151.x86_64/6.4)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : nano-2.0.9-7.el6.x86_64 1/1
Verifying : nano-2.0.9-7.el6.x86_64 1/1
Installed:
nano.x86_64 0:2.0.9-7.el6
Complete!
Sekarang saya ingin menyembunyikan ini dari pengguna dan sebagai gantinya menunjukkan:
Installing nano ......
Bagaimana saya bisa menyelesaikan tugas ini? Saya pasti akan membantu membuat skrip lebih ramah pengguna. Jika terjadi kesalahan, maka itu harus ditampilkan kepada pengguna.
Saya ingin tahu bagaimana menampilkan pesan yang sama saat serangkaian perintah sedang dieksekusi.
echo "Installing nano ......"; yum install nano &> /dev/null
Jawaban:
Gunakan ini.
Penjelasan
Untuk menghilangkan keluaran dari perintah, Anda memiliki dua opsi:
Tutup file deskriptor keluaran, agar tidak menerima masukan lagi. Itu terlihat seperti ini:
Biasanya, keluaran pergi ke deskriptor file 1 (stdout) atau 2 (stderr). Jika Anda menutup deskriptor file, Anda harus melakukannya untuk setiap deskriptor bernomor, karena
&>
(di bawah) adalah sintaks BASH khusus yang tidak kompatibel dengan>&-
:Berhati-hatilah untuk mencatat urutannya:
>&-
closes stdout , yang ingin Anda lakukan;&>-
mengarahkan stdout dan stderr ke file bernama-
(tanda hubung), yang bukan itu yang ingin Anda lakukan. Ini akan terlihat sama pada awalnya, tetapi yang terakhir membuat file yang tersesat di direktori kerja Anda. Mudah diingat:>&2
mengalihkan stdout ke deskriptor 2 (stderr),>&3
mengalihkan stdout ke deskriptor 3, dan>&-
mengalihkan stdout ke jalan buntu (yaitu menutup stdout).Berhati-hatilah juga bahwa beberapa perintah mungkin tidak menangani deskriptor file tertutup dengan baik ("kesalahan tulis: Deskriptor file buruk"), itulah sebabnya solusi yang lebih baik mungkin untuk ...
Alihkan keluaran ke
/dev/null
, yang menerima semua keluaran dan tidak melakukan apa pun dengannya. Ini terlihat seperti ini:Untuk pengalihan keluaran ke file, Anda dapat mengarahkan stdout dan stderr ke tempat yang sama dengan sangat singkat, tetapi hanya di bash:
Terakhir, untuk melakukan hal yang sama untuk sejumlah perintah sekaligus, lingkari semuanya dengan tanda kurung kurawal. Bash memperlakukan ini sebagai sekumpulan perintah , menggabungkan deskriptor file output sehingga Anda dapat mengalihkan semuanya sekaligus. Jika Anda terbiasa dengan subkulit yang menggunakan
( command1; command2; )
sintaks, Anda akan menemukan tanda kurung berperilaku hampir persis sama, kecuali jika Anda tidak melibatkan mereka dalam pipa, kurung kurawal tidak akan membuat subkulit dan dengan demikian akan memungkinkan Anda untuk mengatur variabel di dalamnya.Lihat manual bash tentang pengalihan untuk detail, opsi, dan sintaks lebih lanjut.
sumber
/dev/null
atau/dev/stdout
(atau/path/to/a/logfile
) bersyarat sebelumnya dalam skrip, dan kemudian mengarahkan ke tujuan itu dengan menggunakan&> $output_dest
(atau apa pun nama Anda). Jika Anda tidak ingin menggabungkan stdout dan stderr dalam kasus itu, Anda dapat mengalihkannya secara terpisah seperti> $output_dest 2> $errors_dest
.Anda dapat mengalihkan stdout ke / dev / null.
yum install nano > /dev/null
Atau Anda dapat mengalihkan stdout dan stderr,
yum install nano &> /dev/null
.Tetapi jika program memiliki opsi diam, itu lebih baik.
sumber
Suatu proses biasanya memiliki dua keluaran untuk disaring : stdout ( keluaran standar), dan stderr (kesalahan standar).
Biasanya pesan informasional masuk ke
sdout
, dan kesalahan serta peringatan pergi kestderr
.Anda dapat mematikan
stdout
perintah dengan melakukandan matikan
stderr
dengan melakukan:Jika Anda ingin keduanya lepas , Anda dapat melakukan:
The
2>&1
mengatakan mengirim stderr ke tempat yang sama seperti stdout.sumber
Anda dapat mengarahkan keluaran ke
/dev/null
. Untuk info lebih lanjut tentang / dev / null baca tautan ini .Anda dapat menyembunyikan keluaran dari perintah dengan cara berikut:
Alihkan output standar ke
/dev/null
, tetapi bukan ke kesalahan standar. Ini akan menunjukkan kesalahan yang terjadi selama penginstalan, misalnya jikayum
tidak dapat menemukan paket.Meskipun kode ini tidak akan menampilkan apa pun di terminal karena kesalahan standar dan keluaran standar dialihkan dan dengan demikian dibatalkan
/dev/null
.sumber
>/dev/null 2>&1
akan membisukan keduanyastdout
danstderr
sumber
Anda sebaiknya tidak menggunakan bash dalam kasus ini untuk menghilangkan output. Yum memang memiliki opsi
-q
yang menekan output.Anda pasti juga ingin menggunakan
-y
Untuk melihat semua opsi untuk yum, gunakan
man yum
.sumber
Ketik ".SILENT:" di awal skrip Anda tanpa titik dua.
sumber