/ dev / null dizinine yönlendiriliyor


144

Örnek bir bash shell betiği okuyorum:

#!/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

Burada "/ dev / null 2> & 1" kullanımını anlamaya çalışıyorum. İlk başta, bu betiğin, betiğin çökmesine neden olmadan, hataları inceleyerek yok saymak için / dev / null kullandığını düşündüm (programlama dillerinde istisna yakalamayı deneyin gibi). Çünkü bir dizini bir tar dosyasına sıkıştırmak için tar kullanmanın muhtemelen herhangi bir hataya neden olabileceğini görmüyorum.


3
Yeniden yönlendirmek /dev/nullçökmeyi engellemez, ancak stdout ve stderr çıktı akışlarını temizler. tarçeşitli şekillerde hatalara neden olabilir. Yazma erişiminiz olmayabilir, dosya zaten mevcut olabilir, vb.
Sparhawk

3
Gereksiz çıktılardan kaçınmak için sadece bir numara. Tar neden hatalara gelebilir: hedef dizin mevcut değil, kaynak yok çünkü hedefe yazma veya kaynağa okumadığınız için, çünkü tar$ PATH'nizde olmadığı için tardüştü (hiçbir zaman bilemezsiniz), çünkü cihazda yer kalmadı, çünkü tarsürüm değişti ve şimdi farklı bir sözdizimi gerektiriyor, çünkü disk bir G / Ç hatasına neden oldu. Eminim daha fazlasını bulabilirsin.
terdon

Yanıtlar:


223

Hayır, bu komut dosyasının çökmesini engellemez. tarİşlemde herhangi bir hata meydana gelirse (örneğin: izin reddedildi, böyle bir dosya veya dizin yok, ...) komut dosyası yine de çökecektir.

Kullanmanız > /dev/null 2>&1tüm komut çıktınızı (hem stdoutve stderr) 'e yönlendirecektir /dev/null, yani hiçbir çıktı terminale yazdırılmaz.

Varsayılan olarak:

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

Komut dosyasında, nedenini kullanıyorsunuz > /dev/null:

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

Ve sonra 2>&1neden:

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

3
Anlayış olarak > /dev/null 2>&1, bu komut sonuçlanır stderr ==> stdout, bu yüzden stderr hala stdout'a yazdırılır ??
Weishi Zeng

11
Muhtemelen çok önemli değil, ama ne fd?
kev


7
Neden: CMD > /dev/null 2>&1çalışıyor ama CMD 2>&1 > /dev/nullyine de bana STDERR veriyor?
dbmikus

3
Önerilen: 2>& 1Kod örneklerinde, sayının ve işaretin yeniden yönlendirme operatörünün bir parçası olarak kabul edildiğini vurgulamak için kullanın. Bir dosyaya yönlendirmenin >ve arasında bir boşluk olması yaygındır /path/to/file, bir dosya tanıtıcısına yeniden yönlendirme aslında aynı şeydir.
Henk Langeveld

21

Burada "> / dev / null 2> & 1" 'in kullanımını anlamaya çalışıyorum.

( /dev/nullsorunuza daha önce yönlendirmeyi eklediğimi unutmayın .)

Yukarıda yönlendirir: STDOUTve STDERRiçin /dev/null. STDERRİçine birleştirerek çalışır STDOUT. (Temel olarak komuttan gelen tüm çıktılar boş cihaza yönlendirilir .)

... betiğin çökmesine neden olmadan (programlama dillerinde istisna yakalamayı deneyin gibi).

Bir try/catchşey ya da hiçbir şey gibi değil . Basitçe susturan komutundan (hata dahil) çıktı türlü.

Çünkü bir dizini bir tar dosyasına sıkıştırmak için tar kullanmanın muhtemelen herhangi bir hataya neden olabileceğini görmüyorum.

Aşağıdakiler dahil birkaç nedenden dolayı hatalarla sonuçlanabilir:

  • Arşivlemeye çalıştığınız dosya (lar) da veya yazmaya çalıştığınız dosyada yetersiz izinler
  • Arşiv oluşturmak için yeterli disk alanı yok

iyi açıklanmış.
Aditya Gupta

7

CMD'yi çalıştırdığınızda> / dev / null 2> & 1

STDOUT, / dev / null dizinine yönlendirir ve sonra STDERR, / dev / null olarak ayarlanan STDOUT ADRESİNE, dolayısıyla hem STDOUT hem de STDERR işaretini / dev / null olarak gösterir.

Muhalif, CMD 2> & 1> / dev / null çalıştırdığınızda

STDERR, STDOUT ADRESİNE (o sırada Dosya tanımlayıcı 1 veya / proc / self / fd / 1) yönlendirir ve sonra STDOUT / dev / null'a yönlendirir, ancak STDERR fd1'e yönlendirmeyi sürdürür !! Sonuç olarak, STDOUT’dan gelen normal çıktı atılır, ancak STDERR’den gelen hatalar hala konsolda yazılıyor.


-2

Bash G / Ç Yönlendirme

Olayları temizlemek için ana fikir şudur:

Yönlendirmeler, İngilizce konuşanlar normalde okunduğu gibi, RIGHT'dan LEFT'a kadar uygulanır.


Yani bu kod:

command > filename 2>&1

yönlendirir stderriçin stdout ilk ( 2>&1) ve daha sonra gönderir stdout(yönlendirilen dahil stderriçin) filename( > filename). İşte ABSG açıklaması (Bölüm 20) .

Bu kod:

command >>/dev/null 2>&1

yönlendirmeleri stderrve stdouthiç /dev/nulldemektir ... hangi yerde . Gönderilenler /dev/nullhiçbir şekilde kaydedilmez, önbellekte saklanmaz veya hatırlanmaz.

Onlar sadece ' hiçbir yere ' gönderilir ve unutulur. Bu, programları çalıştırmanın ve NO çıktısı üretmelerini sağlamanın ve komut satırında veya bir günlük dosyasında asla görülmeyeceğinin bir yoludur.


Bu tür bir soruyu biraz görüyorum ... temelde yıllardır kodlamadığımdan beri kendime bakmak zorunda kaldım. İşte ABSG'den gelen bazı kullanışlı bilgiler:

"Yeniden yönlendirme, bir dosyadan, komuttan, programdan veya komut dosyasından çıktı almak ve başka bir dosya, komut, program veya komut dosyasına girdi olarak göndermek anlamına gelir."

2>&1 
# Redirects stderr to stdout.

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

ABSG: Gelişmiş Bash Komut Dosyası Kılavuzu: Yukarıdaki Bölüm 20 bağlantısı , Mendel Cooper'ın Gelişmiş Bash Komut Dosyası Kılavuzu adlı açık kaynaklı tldp.org belgesinin G / Ç yönlendirme sayfasına bir bağlantıdır . “Kabuk yazım sanatının derinlemesine bir keşfi” olarak listelenmiştir ve kesinlikle katılıyorum. Müthiş bir kaynak ve her türlü çılgın durum için tonlarca cevabı var.

Diğer Değerli Kaynaklar: akım / tutulan bölümünde birçok değerli kaynak vardır (html, pdf, metin, vb gibi çeşitli kullanışlı biçimlerde) üzerinde Linux Belgeleme Projesi Kılavuzları sayfa. İşte yararlı bulduk birkaç tane:


1
Hayır, yönlendirmeler soldan sağa alınır. Örneğinizde, standart çıktıya yönlendirilir filename, daha sonra standart hata şu anda standart çıktıya (nereye filename) gidiyorsa oraya yönlendirilir . Etrafının tam tersi bir yol olsaydı, sadece standart çıkış yönlendirilirken terminalde standart hata olur filename. Ayrıca command >file1 2>file2, file2eğer oluşturulan olmaz file1(olursa olsun, ister oluşturulamadı file1ve file2aslında tamamen farklı pathnames vardı).
Kusalananda
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.