>
İş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:
1
O anlamına gelir standart çıkış (stdout'u). 2
O 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/null
Komut 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?
stderr
doğrudan /dev/null
yerine gönderirdi . Sen deneyerek pratikte görebilirsiniz curl
, curl 1>/dev/null
ve curl 2>/dev/null
sadece çı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.com
içinde arka ve atın hem stdout
ve stderr
.
curl http://www.google.com > /dev/null 2>&1 &
aynıdır
curl http://www.google.com > /dev/null 2>/dev/null &
0
, 1
Ve 2
standart 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. curl
belirtilen 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
, ls
geç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.txt
için dosya içeriğini ekrana getirin.
İlk bölüm > /dev/null
yönlendirir stdout
yani curl
için 'ın çıkış /dev/null
(ileride Bu konuda daha fazla) ve 2>&1
yönlendirmeleri stderr
için stdout
(sadece yönlendirildi hangi /dev/null
böylece her şey gönderilecektir /dev/null
).
Sol tarafı 2>&1
anlatı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ı 1
veya 2
. Bu nedenle, 2>1
(zaten mevcut değilse) yeni bir dosya oluşturup 1
, stderr
sonucu oraya dökecekti.
/dev/null
boş bir dosya, kendisine yazılan her şeyi atmak için kullanılan bir mekanizma. Yani,
curl http://www.google.com > /dev/null
etkili 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>&1
hem curl
çıktısını hem de curl
ilerleme 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 jobs
için terminalinize yazın. Bunun sisteminizde çalışan işlemlerden farklı olduğunu unutmayın . top
Terminalde bu tiplerini görmek için.
/dev/null
? En curl
azı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 > logfile
2> & 1