Bash'de komut çıktısı nasıl gizlenir


105

Bash komut dosyalarımı son kullanıcı için daha zarif hale getirmek istiyorum. Bash komutları yürütürken çıktıyı nasıl gizlerim?

Örneğin, Bash çalıştırıldığında

yum install nano

Aşağıdakiler, Bash'i çalıştıran kullanıcıya gösterilecektir:

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) <centos-6-key@centos.org>
 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!

Şimdi bunu kullanıcıdan gizlemek ve bunun yerine şunu göstermek istiyorum:

    Installing nano ......

Bu görevi nasıl başarabilirim? Senaryonun daha kullanıcı dostu olmasına kesinlikle yardımcı olacağım. Bir hata olması durumunda kullanıcıya gösterilmelidir.

Bir dizi komut yürütülürken aynı mesajı nasıl göstereceğimi bilmek istiyorum.


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


Yanıtlar:


253

Bunu kullan.

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

Açıklama

Komutlardan çıktıyı ortadan kaldırmak için iki seçeneğiniz vardır:

  • Daha fazla girdi kabul etmesini engelleyen çıktı tanımlayıcı dosyasını kapatın. Şuna benziyor:

    your_command "Is anybody listening?" >&-
    

    Genellikle çıktı, dosya tanımlayıcı 1'e (stdout) veya 2'ye (stderr) gider. Bir dosya tanımlayıcısını kapatırsanız, &>(aşağıda) aşağıdakilerle uyumlu olmayan özel bir BASH sözdizimi olduğundan , bunu her numaralı tanımlayıcı için yapmanız gerekir >&-:

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

    Sıraya dikkat edin: >&- stdout'u kapatır , bu da yapmak istediğiniz şeydir; &>-stdout ve stderr'i -(tire) adlı bir dosyaya yönlendirir , ki bu yapmak istediğiniz şey değildir. İlk başta aynı görünecek, ancak ikincisi çalışma dizininizde başıboş bir dosya oluşturur. Hatırlaması kolaydır: >&2stdout'u tanımlayıcı 2'ye (stderr) >&3yönlendirir, stdout'u tanımlayıcı 3'e >&-yeniden yönlendirir ve stdout'u çıkmaz bir uca yönlendirir (yani stdout'u kapatır).

    Ayrıca bazı komutların kapalı bir dosya tanımlayıcısını özellikle iyi işleyemeyeceğine dikkat edin ("yazma hatası: Kötü dosya tanımlayıcı"), bu yüzden daha iyi bir çözüm olabilir ...

  • Çıktıyı/dev/null , tüm çıktıları kabul eden ve onunla hiçbir şey yapmayan yönlendir . Şöyle görünüyor:

    your_command "Hello?" > /dev/null
    

    Bir dosyaya çıktı yeniden yönlendirmesi için, hem stdout hem de stderr'i aynı yere çok kısaca yönlendirebilirsiniz, ancak yalnızca bash ile:

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

Son olarak, birkaç komut için aynı şeyi yapmak için, her şeyi küme parantezleri içine alın. Bash, bunu bir komut grubu olarak ele alır ve çıktı dosyası tanımlayıcılarını bir araya getirir, böylece hepsini bir kerede yeniden yönlendirebilirsiniz. Bunun yerine ( command1; command2; )sözdizimini kullanan alt kabuklara aşina iseniz, küme parantezlerinin hemen hemen aynı şekilde davrandığını göreceksiniz, tek fark, onları bir boruya dahil etmediğiniz sürece, parantezlerin bir alt kabuk oluşturmayacağı ve böylece içerideki değişkenleri ayarlamanıza izin vermesi dışında.

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

Daha fazla ayrıntı, seçenek ve sözdizimi için yeniden yönlendirmelerle ilgili bash kılavuzuna bakın .


Merhaba, bunun eski bir soru olduğunu biliyorum ama aynı şey şartlı olarak yapılabilir mi? Çıkışı belirli koşullar altında gizlemek istediğim gibi mi? Aynı bölümü if-else altında kopyalayabileceğimi biliyorum ama bunu yapmanın daha iyi bir yolu var mı?
Usama Zafar

@UsamaZafar Bunu , komut dosyasında ya da (veya ) koşullu olarak daha önce ayarladığınız bir değişken ( "kabuk parametresi" ) ayarlayarak ve sonra onu kullanarak (veya ne adlandırırsanız) o hedefe yeniden yönlendirerek yapardım . Bu durumda stdout ve stderr'i birleştirmek istemiyorsanız, bunları ayrı ayrı yönlendirebilirsiniz . /dev/null/dev/stdout/path/to/a/logfile&> $output_dest> $output_dest 2> $errors_dest
Jeff Bowman

36

Stdout'u / dev / null'a yeniden yönlendirebilirsiniz.

yum install nano > /dev/null

Veya hem stdout hem de stderr'i yeniden yönlendirebilirsiniz,

yum install nano &> /dev/null.

Ancak programın sessiz bir seçeneği varsa, bu daha da iyi.


23

Bir işlemin normalde görüntülenecek iki çıkışı vardır: stdout (standart çıkış) ve stderr (standart hata).

Normalde bilgilendirici mesajlar sdout, hatalar ve uyarılar gider stderr.

Bunu stdoutyaparak bir komut için kapatabilirsiniz

MyCommand >/dev/null

ve şunu stderryaparak kapatın :

MyCommand 2>/dev/null

Her ikisini de kapatmak istiyorsanız şunları yapabilirsiniz:

MyCommand 2>&1 >/dev/null

2>&1Stdout'a aynı yere stderr'yi göndermek söylüyor.


8

Çıkışı 'a yönlendirebilirsiniz /dev/null. / Dev / null ile ilgili daha fazla bilgi için bu bağlantıyı okuyun .

Bir komutun çıktısını aşağıdaki şekillerde gizleyebilirsiniz:

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

Standart çıktıyı /dev/null, ancak standart hataya yönlendirmeyin. Bu, örneğin yumbir paket bulamıyorsanız , kurulum sırasında meydana gelen hataları gösterecektir .

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

Bu kod, hem standart hata hem de standart çıktı yeniden yönlendirildiğinden ve dolayısıyla sıfırlandığından uçbirimde hiçbir şey göstermez /dev/null.


1
Harika paylaşım .... dostum, aynı mesajı bir dizi komut için yalnızca bir kez nasıl
çıkaracağımı

5

>/dev/null 2>&1ikisini de sessize alacak stdoutvestderr

yum install nano >/dev/null 2>&1

4

Bu durumda çıktıdan kurtulmak için bash kullanmamalısınız. Yum'un -qçıktıyı bastıran bir seçeneği var .

Kesinlikle kullanmak isteyeceksiniz -y

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

Yum için tüm seçenekleri görmek için kullanın man yum.


Teşekkürler, yum'un apt-get -qq kullandığından beri bastırmak için bir tane olduğunu varsaydım. Bu, yaptığım şey için yardımcı oldu.
Hyperion

0
.SILENT:

Komut dosyanızın başına iki nokta üst üste olmadan ".SILENT:" yazın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.