>İşaretin komut satırında çıktı yönlendirmesi için kullanıldığını biliyorum , ancak komut satırında kullanımını açıklayan bir şey bulmakta güçlük çekiyorum 2>&1. Örneğin:
curl http://www.google.com > /dev/null 2>&1 &
>İşaretin komut satırında çıktı yönlendirmesi için kullanıldığını biliyorum , ancak komut satırında kullanımını açıklayan bir şey bulmakta güçlük çekiyorum 2>&1. Örneğin:
curl http://www.google.com > /dev/null 2>&1 &
Yanıtlar:
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.
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.
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?
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.
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 &
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.

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.
İ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/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 .

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.
&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.
/dev/null? En curlazından faydalı bir yerin sonuçlarını istemiyor musun ?
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