“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ş 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.