Cara menyembunyikan keluaran perintah di Bash

100

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.

pengguna2650277
sumber
4
echo "Installing nano ......"; yum install nano &> /dev/null
user000001

Jawaban:

248

Gunakan ini.

{
  /your/first/command
  /your/second/command
} &> /dev/null

Penjelasan

Untuk menghilangkan keluaran dari perintah, Anda memiliki dua opsi:

  • Tutup file deskriptor keluaran, agar tidak menerima masukan lagi. Itu terlihat seperti ini:

    your_command "Is anybody listening?" >&-

    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 >&-:

    /your/first/command >&- 2>&-

    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: >&2mengalihkan stdout ke deskriptor 2 (stderr), >&3mengalihkan 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:

    your_command "Hello?" > /dev/null

    Untuk pengalihan keluaran ke file, Anda dapat mengarahkan stdout dan stderr ke tempat yang sama dengan sangat singkat, tetapi hanya di bash:

    /your/first/command &> /dev/null

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.

{
  /your/first/command
  /your/second/command
} &> /dev/null

Lihat manual bash tentang pengalihan untuk detail, opsi, dan sintaks lebih lanjut.

Jeff Bowman
sumber
Hai, saya tahu ini pertanyaan lama, tetapi bisakah hal yang sama dilakukan secara bersyarat? Seperti saya ingin menyembunyikan keluaran dalam kondisi tertentu? Saya tahu saya dapat mereplikasi bagian yang sama di bawah if-else tetapi adakah cara yang lebih baik untuk melakukannya?
Usama Zafar
@UsamaZafar Saya akan melakukannya dengan menetapkan variabel ( "parameter shell" ), yang Anda setel ke salah satu /dev/nullatau /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.
Jeff Bowman
35

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.

ktm5124
sumber
23

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 stdoutperintah dengan melakukan

MyCommand >/dev/null

dan matikan stderrdengan melakukan:

MyCommand 2>/dev/null

Jika Anda ingin keduanya lepas , Anda dapat melakukan:

MyCommand 2>&1 >/dev/null

The 2>&1mengatakan mengirim stderr ke tempat yang sama seperti stdout.

LeOn - Han Li
sumber
8

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:

echo -n "Installing nano ......"; yum install nano > /dev/null; echo " done."; 

Alihkan output standar ke /dev/null, tetapi bukan ke kesalahan standar. Ini akan menunjukkan kesalahan yang terjadi selama penginstalan, misalnya jika yumtidak dapat menemukan paket.

echo -n "Installing nano ......"; yum install nano &> /dev/null; echo " done.";

Meskipun kode ini tidak akan menampilkan apa pun di terminal karena kesalahan standar dan keluaran standar dialihkan dan dengan demikian dibatalkan /dev/null.

Giuseppe Pes
sumber
1
Berbagi hebat .... sobat dapatkah Anda menunjukkan kepada saya bagaimana mengeluarkan pesan yang sama hanya sekali untuk satu set perintah
pengguna2650277
5

>/dev/null 2>&1akan membisukan keduanya stdoutdanstderr

yum install nano >/dev/null 2>&1
Quanlong
sumber
4

Anda sebaiknya tidak menggunakan bash dalam kasus ini untuk menghilangkan output. Yum memang memiliki opsi -qyang menekan output.

Anda pasti juga ingin menggunakan -y

echo "Installing nano..."
yum -y -q install nano

Untuk melihat semua opsi untuk yum, gunakan man yum.

kkeller
sumber
Terima kasih, saya berasumsi yum memilikinya sejak apt-get used -qq juga untuk menekan. Ini sangat membantu untuk apa yang saya lakukan.
Hyperion
0
.SILENT:

Ketik ".SILENT:" di awal skrip Anda tanpa titik dua.

Arif
sumber