“2> & 1” komut satırında ne yapar?


Yanıtlar:


78

1O anlamına gelir standart çıkış (stdout'u). 2O anlamına gelir standart hata (stderr).

Yani 2>&1, standart çıktının da yönlendirildiği yere standart hata gönderileceğini söylüyor. Bu, gönderildiğinden beri /dev/null, herhangi bir çıktının hiç yok sayılmasına benzer.


2
Bir işaretin 1'den önce, 2'den önce görünmemesinin bir nedeni var mı? Ben & arka planda bir iş çalıştırmak için ayrılmış bir karakter olduğunu düşündüm, ama sanırım sadece ve işareti komutun sonunda uzun bir karakter olarak görünüyorsa ...?
Matt Huggins

8
Çünkü 0(stdin), 1(stdout) ve 2(stderr) aslında tanımlayıcılar dosya olan kabuk yönlendirme için önlerine koymak bir işareti gerektirir. Bu durumda, dosya tanımlayıcısını iki bilgi akışını birlikte etkin bir şekilde birleştirerek çoğaltır.
Chealion

12
Bunu şu şekilde düşünün: Eğer sadece "1" işareti ve işareti olmadan, kabuk "1" adında bir dosya oluşturur ve stderr çıktısını yönlendirir.
CarlF

1
Tamam, bu yalnız o zaman geçerli olur mu? curl http://www.google.com 2>/dev/nullKomut satırı, buradaki "2" nin stderr anlamına geldiğini ve gerçekte curl komutuna geçirdiğim ikinci parametre olmadığını nasıl biliyor?
Matt Huggins

1
@ Matt Huggins: Evet. Tüm çıktıları stderrdoğrudan /dev/nullyerine gönderirdi . Sen deneyerek pratikte görebilirsiniz curl, curl 1>/dev/nullve curl 2>/dev/nullsadece çıkış değişimi görmek için. Yine, işaret işareti yalnızca yönlendirilen dosya tanıtıcısı için gereklidir.
Chealion

23

tl; Dr.

Getirme http://www.google.comiçinde arka ve atın hem stdoutve stderr.

curl http://www.google.com > /dev/null 2>&1 &

aynıdır

curl http://www.google.com > /dev/null 2>/dev/null &

temeller

0, 1Ve 2standart dosya temsil tanımlayıcılar içinde POSIX işletim sistemleri. Bir dosya tanıtıcısı bir dosya veya sokete (temelde) bir sistem referansıdır .

C'de yeni bir dosya tanıtıcısı oluşturmak şuna benzeyebilir:

fd = open("data.dat", O_RDONLY)

Çoğu Unix sistem komutu bir miktar girdi alır ve sonucu terminale gönderir. curlbelirtilen url’de ne olursa olsun ( google dot com ) getirilir ve sonucu gösterilir stdout.

kıvrılma sonucu

Yönlendirme

Söylediğiniz <ve >çıktıyı bir komuttan başka bir yere, bir dosya gibi yönlendirmek için kullanılır.

Örneğin, içinde ls > myfiles.txt, lsgeçerli direktörün içeriğini alır ve >çıktısını yönlendirir myfiles.txt(eğer dosya yoksa, oluşturulur, aksi takdirde üzerine yazılır, ancak dosyaya eklemek >>yerine onu kullanabilirsiniz >). Yukarıdaki komutu çalıştırırsanız, terminalde hiçbir şeyin görünmediğini göreceksiniz. Bu genellikle Unix sistemlerinde başarı demektir. Bunu kontrol etmek cat myfiles.txtiçin dosya içeriğini ekrana getirin.

> / dev / null 2> & 1

İlk bölüm > /dev/nullyönlendirir stdoutyani curliçin 'ın çıkış /dev/null(ileride Bu konuda daha fazla) ve 2>&1yönlendirmeleri stderriçin stdout(sadece yönlendirildi hangi /dev/nullböylece her şey gönderilecektir /dev/null).

Sol tarafı 2>&1anlatır neyi yönlendirilecek ve sağ taraf anlatır nereye kadar. &Ayırt etmek sağ tarafında kullanılan stdout (1)veya stderr (2)adlandırılmış dosyaları 1veya 2. Bu nedenle, 2>1(zaten mevcut değilse) yeni bir dosya oluşturup 1, stderrsonucu oraya dökecekti.

/ Dev / null

/dev/nullboş bir dosya, kendisine yazılan her şeyi atmak için kullanılan bir mekanizma. Yani, curl http://www.google.com > /dev/nulletkili bir şekilde curlçıktısını bastırıyor .

> / dev / null

Fakat neden hala terminalde bazı şeyler var? Bu değil curl normal çıktı 'ın, ancak gönderilen veriler stderr, ilerleme ve teşhis bilgilerini ve sadece göstermek için burada kullanılan hataları .

curl http://www.google.com > /dev/null 2>&1hem curlçıktısını hem de curlilerleme bilgisini yoksayar . Sonuç terminalde hiçbir şey görüntülenmiyor.

En sonunda

&Sonunda bir şekilde komutu çalıştırmak için kabuk söylemek nasıl içinde arka . Bu , komutun sahne arkasında eşzamansız olarak çalıştırıldığı sırada komut isteminin hemen geri dönmesine neden olur . Mevcut işleri görmek jobsiçin terminalinize yazın. Bunun sisteminizde çalışan işlemlerden farklı olduğunu unutmayın . topTerminalde bu tiplerini görmek için.

Referanslar


1
Bu, web sitesi genelindeki en iyi cevaplardan biri.
OmarOthman

Almadığım bir şey neden her şeyi yollamak istediğin /dev/null? En curlazından faydalı bir yerin sonuçlarını istemiyor musun ?
skube

@ skube Doğru. Bu durumda, kullanıcının neden hem stdout'u hem de stderr'i atmak istediği açık değildir. OP muhtemelen sadece sözdiziminin ne anlama geldiğini anlamak istedi.
Jorge Bucaran

5

2STDERR'yi belirtir. 2>&1STDERR'yi 1(STDOUT) ile aynı yere gönderir .


0

Benim takip ettiğim gibi anlıyorum:

Sadece ekrandaki komutun Çıktı ve Hata bilgilerini okumak istiyorsanız, yazmanız yeterlidir: curl http://www.google.com

Bazı durumlarda daha sonra gözden geçirmek üzere Çıktı bilgisini terminal ekranı yerine bir dosyaya kaydetmek isterseniz, aşağıdakileri yazabilirsiniz: curl http://www.google.com > logfile

Fakat bu şekilde StdErr bilgisi ihmal edilir, çünkü >sadece StdOut'u yönlendirir logfile.

Bu nedenle, bir kez çalıştırılamadığında komutun hata bilgisini önemsiyorsanız, StdOut'u StdErr ile birleştirmeniz gerekir 2>&1(StdErr'i StdOut'a katlayın), bu nedenle aşağıdaki komut satırı yazılabilir: curl http://www.google.com > logfile2> & 1

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.