Standart Girdi
UNIX dünyasında, programların standart çıktıları gibi, aslında standart girdileri de vardır. Biraz önceki örneğimizde cat
programı ile ls_cikti
dosyasının içeriğini görüntülerken, okunacak veriyi standart girdi olarak sunmayıp, aslında parametre olarak gönderdik. Yani cat /home/eaydin/ls_cikti
yazdığımız zaman, aslında cat
programı ilk parametresi olan /home/eaydin/ls_cikti
değerini okudu. Eğer bu dosyayı parametrik olarak değil de, standart girdi olarak sunmak isteseydik, şöyle bir işlem yapmamız gerekirdi:
Gördüğünüz gibi, burada standart çıktı işaretinin tersini (<) kullanıyoruz. Standart girdilerde, üzerine yazma gibi bir durum söz konusu olmadığından, << gibi bir notasyona gerek kalmaz.
Yukarıda kullandığımız cat
programı örneği, her ne kadar standart girdi kullanmış olsa da, pek bir anlam ifade etmeyebilir. En nihayetinde kullanıcı açısından dosya ismini parametrik olarak belirtmek ile standart girdi olarak belirtmek arasında bir fark bulunmamaktadır. Aslında teknik olarak bir fark var ancak buna birazdan değineceğiz.
cat
programı eğer standart girdiden veri beklentisi içindeyse, cat
programını hiçbir parametre kullanmadan çalıştırırsak ne olur? Bu sorunun cevabını cat
programı çalıştırıp "Bu bir cümle" yazarak deneyelim.
Yukarıda ne olup bittiğine bir bakalım: Hiçbir parametre göndermeden cat
programını çalıştırıyoruz. Sonra program bizden (standart girdiden) bir girdi bekliyor. Biz de "Bu bir cümle" yazıp ENTER tuşuna basıyoruz. Ardından ekranda bir satır daha kendiliğinden beliriyor ve bizim yazdığımız cümlenin aynısını yazıyor. Sonra CTRL+c tuşu ile programı sonlandırıyoruz.
Bu örnekteki ikinci "Bu bir cümle" satırının yazmasının sebebi, cat
programının işlevinde yatmaktadır. Standart girdi veya parametrik dosya belirtilmesi farketmeksizin cat
programı, kendisine gönderilen verinin standart çıktıya yazdırılması işlemini gerçekleştirdiği için, biz "Bu bir cümle" yazıp programa bunu sunduktan sonra, program bunu standart çıktıya yazıyor. Dolayısıyla ekranda iki kez görmüş oluyoruz.
Eğer cat
programını çalıştırırken standart çıktıyı bir dosyaya yönlendirseydik, durum farklı olurdu.
Burada programa standart girdiden veri gönderdik, ancak standart çıktıyı deneme
dosyasına yönlendirdiğimiz için, ekranımızda ikinci kez görmedik. deneme
dosyasının içeriğini okuyacak olursak ne beklediğimiz aşikar sanırım.
Bütün bu örneklerin hala bir şey ifade etmediğinin farkındayız. Çünkü cat
, zaten dosya okuma amacı güden bir program. Bunun yerine daha sık kullanılan bir örnek olan, MySQL veritabanının komut satırı aracı mysql
programının kullanımına bakalım.
MySQL ile ilgili detaylar kitabımızın farklı bir bölümünde anlatılmakta ancak kısaca programın bir veritabanının yapısını komut satırından yönetmeye olanak sağladığını belirtelim. mysql
programı etkileşimli bir programdır, yani Douglas McIlroy'un ikinci maddede bahsettiği, aslında kaçınmamız gereken program tiplerinden birisidir. Ancak bir veritabanını yönetmenin en kullanışlı yollardından birinin bu olduğu unutulmamalıdır. mysql
programını doğru parametrelerle çalıştırıp veritabanına bağlandığımızda, bizi kendi kabuğu (etkileşimli ortamı) karşılar.
Burada örneğin, mevcut veritabanlarını listeletmek için, show databases
komutunu girmemiz gerekir.
Aslında, buradaki show databases
bilgisini, mysql
komutuna standart girdiden, yani klavyemizden girmiş bulunduk.
Bunun yerine, bir metin dosyasına show databases
yazıp, bu metin dosyasını mysql
programına standart girdi olarak sunabilirdik. komutlar
dosyasının içeriği show databases
olmak üzere, aşağıdaki gibi bir notasyonla, mysql
programına komutlarımızı gönderebiliriz.
Çıktılardaki ufak fark (tablolu yapı, kaç satır döndüğü vs.) sizi yanıltmasın. Bu tamamen mysql
programının ayarlarıyla ilgili. Burada esas dikkat edilmesi gereken nokta, MySQL geliştiricilerinin, programlarını standart girdiden veri okuyabilecek şekilde yazmış olması. Bu açıdan bakınca, aslında David McIlroy'un ikinci maddesi ile uyumlu bir yazılım ortaya çıkmış oluyor. Program, etkileşimli girdi konusunda ısrarcı olmuyor. Ayrıca çıktıda, yine McIlroy'un bahsettiği gibi "gereksiz tablolu yapılar" bulunmuyor.
MySQL bir yana, hemen her veritabanı programı bu şekilde çalışmaktadır. Bu özellikle de veritabanlarına yedeklerin yüklenmesi konusunda kullanılan yöntemlerden birisidir. Aslında bir veritabanı yedeği aldığınızda, size bir dizi komut çıktısı verir. Bu çıktıyı dilediğiniz gibi şekillendirebilir, ve yeniden programlara standart girdiden sunabiliriniz.
Eğer mysql
programına komutları dosya içerisinden değil de, doğrudan terminal ile sunmak istersek, <<< notasyonunu kullanabiliriz. Biraz önceki örneğimizde komutlar dosyasının içerisine show databases
yazıp, komutlar
dosyasını standart girdi olarak sunmuştuk. Aslında bu dosyayı hiç oluşturmadan aşağıdaki gibi bir yöntem de izleyebilirdik.
Hatırlarsanız bu bölümde cat
programına parametrik kullanım ve standart girdi ile veri sağlanmasının kullanıcı açısından pek bir fark yaratmadığını, ancak ufak bir farklılığı olduğundan bahsetmiştik.
cat dosya-ismi
kullanımında, önce cat
programı çalıştırılır, cat
programı da parametreleri hangi sırada nasıl okuyorsa ona göre ilgili işlemleri yapar. Ancak cat < dosya-ismi
kullanımında, kabuk (shell) önce dosya-ismi
dosyasını yüklemeye çalışır, eğer bu dosya mevcut değil veya kullanıcı tarafından erişilemez durumdaysa, hata verir ve cat
programını hiç çalıştırmaz bile. Bu, özellikle cat
gibi küçük programlarda hissedilmeyen etkilere sebep olur ancak mysql
veya çok daha büyük bir programın her defasında boş yere çağırılmasına engel olabileceği için, aslında kabuk programlamada mümkünse kullanılması gereken yöntemlerden birisidir ve doğru kullanıldığında bazı noktalarda sisteminizin daha verimli çalışmasını sağlayabilir.
Standart girdinin < notasyonu ile kullanımı, yıllarca UNIX sistemler yönetmiş bir kişinin bile çok nadir karşılaştığı durumlar olabilir. Bu kitapta da özellikle crontab ve netcat bölümlerinde birkaç örneği dışında denk gelmemeniz olası. Ancak standart girdinin ne işe yaradığının anlaşılması, özellikle birazdan göreceğimiz pipe mekanizmasının anlaşılmasında belkemiği görevi görmektedir.
Last updated