Başka bir Cuma gününe hoş geldiniz ...
Terminalin küçük bir bölümünü tanımanın zamanı geldi. Çok düşündükten sonra, standart akışlar; Yüzeysel olsa da herkesin bilmesi gereken bir şey olduğunu düşünüyorum.
Standart Akış
Standart Akış Kullanıcı ile terminal arasındaki birkaç iletişim kanalından oluşur. Bu Giriş / Çıkış "kanalları", bir komut yürütüldüğünde bilgileri görüntüler veya yakalar.
3 I / O bağlantısı şunlardır: stdin Standart giriş, stdout'u Standart çıktı, Stderr Standart hata.
stdin: Standart giriş
Standart girdi, borular, yeniden yönlendirme, klavye vb. Aracılığıyla bir komuttan bilgi alma yöntemimizdir. Bunu dosya tanımlayıcısı 0 ile tanımlıyoruz.
Bir stdin örneği şöyle olacaktır:
sırala <listeleme
Listedeki tüm bilgileri alır - bu durumda rastgele yazılan sayıları - ve dosyayı ls komutuna yönlendirirken sayısal listeyi alfabetik olarak sıralar. Bu örnekte bayraklar örtüktür.
stdout: Standart çıktı
Standart çıktı, adından da anlaşılacağı gibi, konsol aracılığıyla bir komutun çıktısını görüntüler. Ls yazarsak, ekranda bize gösterdiği tüm bilgiler standart çıktıdır. Tanımlayıcı 1 ile temsil edilir.
Şimdi sadece bash hahaha'yı sevdiğim için bash ile yazılmış bir senaryo ile stdin ve stdout'u somutlaştırmaya çalışacağım. 🙂
test.sh
#! / bin / bash eğer [-t 0]; then echo "Standart çıktı kullanıyorsunuz" elif [-t 1]; then echo "stdin kullanıyorsunuz" else echo "Acımasız hata" fi
Şimdi komut dosyasının nasıl kullanılacağını gösteren bir ekran görüntüsü. Komut dosyasıyla bir boruyu yeniden yönlendirirken veya kullanırken -t testi sadece stdout betiğinin çalıştırılıp çalıştırılmadığını ve değilse açıkça stdin olduğunu bilmek.
bash test.sh ls | bash testi.sh bash testi.sh </ etc / passwd
Öğrenmek için komutu değiştirmeyi ve alıştırma yapmayı unutmayın.
stderr: Standart hata
Standart Hata, programların hataları veya teşhisi gösterme şeklidir. Tanımlayıcı 2 ile temsil edilir.
Kavramı anlamak için durum budur: bir komuttan bir hatayı kaydetmek istediğimizde, ilk düşündüğümüz şey çıktıyı düz metne yönlendirmektir.
ls> info.txt
Bu işe yarar, komut bilgileri düz metin dosyasında saklanır. Fakat hata kaydedildiğinde onu kaydetmez, ancak ekranda gösterir ve düz metin dosyası boştur.
Bunun yerine, stderr'i dosyaya kaydetmeyi belirtmek için 2> kullanırsak:
ls foo 2> info.txt
Şimdi hata bilgilerini metin dosyasına kaydedecektir.
En Kabuk stderr ve stdout'un &> ile tek bir komutta depolanmasına izin verin, burada Foo var olmayan bir dizindir
ls İndirilenler Foo &> info.txt
Bu dosya, Foo'da ls çalıştırılırken oluşan hatanın bilgisini içerecek ve İndirilenler altındaki dizinleri listeleyecektir.
Ve son olarak, bu ünlü ne? 2> & 1?
Basit, stderr'i stdout'a yönlendirin. Bu &> ve 1'in ortasında, stdout'a yönlendirileceği anlamına gelir. Orada olmasaydı, "hatayı 1. dosyaya yönlendir" gibi bir şey olurdu.
Ve bununla aşağıdakileri yeniden yönlendirmek mümkündür:
- bir dosyaya standart çıktı
- stderr bir dosyaya
- stdout'tan stderr'e
- stderr'den stdout'a
- stderr ve stdout bir dosyaya
- inter alia olarak
Bugün insanlar için bu kadar. Uğradığınız için okuduk ve teşekkür ederiz. 😀
İlginç. Öğreticileriniz sayesinde Bash'i daha çok seviyorum.
Sevgili, ilginç, ancak aşağıdaki satırda bir hata var:
"Ve dosyayı ls komutuna yeniden yönlendirirken", "ve dosyayı sıralama komutuna yeniden yönlendirirken" olmalıdır.
Bir tebrik.
Metnin başında bir hata var, "ls" komutunu belirttiğinizde, "sırala" olmalıdır:
"Listedeki tüm bilgileri alın - bu durumda rastgele yazılan sayılar - ve dosyayı ls komutuna yönlendirin (burada sıralama olacaktır)"
Selamlar ve çalışmalarınızı paylaştığınız için teşekkürler
Bu, çıktının temizlenmesini (/ dev / null), ancak hataların dosyalarda saklanmasını istediğiniz cron için harikadır. Ayrıca, bunu yaptığımda, tam olarak ne zaman başarısız olduklarını belirtmek için genellikle date komutunu kullanırım.
Bash (sh), Unix felsefesi tarafından geliştirilen bu araçlara sahiptir.
Ben hiçbir şey bulamadım
Haha iyi anlatılıyor, neyi anlamadınız?