Girdi - Çıktı Yönlendirme
Linux'ta, çalıştırdığınız komutların çıktısını farklı amaçlar için saklama ihtiyacı duyabilirsiniz. Örneğin, bir sistemi analiz ettiniz ve güncellenmesi gereken paketlerin bir listesini edindiniz ve bu listeyi ilgili ekiplerle paylaşmak istiyorsunuz. Bazen de, komutunuzun tüm çıktısını, başka bir programa girdi olarak vermek isteyebilirsiniz.
Böyle durumlarda girdi - çıktı yönlendirme (IO redirection) yardımınıza koşar.
Linux Shell'inde ">" İşareti
>
işaretini kullanarak, komutunuzun çıktısını bir dosyaya yönlendirebilirsiniz. Burada dikkat edilmesi gereken en önemli nokta, bu işaretin var olan içeriği silmesidir.
Bir örnekle inceleyelim. Öncelikle sistemde çalışan process'lerin bir listesini, process.txt
dosyasına yönlendirelim. Sonrasında farklı bir komut çalıştırarak dosya içeriğindeki değişimi gözlemleyelim:
ali@zion:~$ ps aux > process.txt
ali@zion:~$ cat process.txt
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.0 168552 11784 ? Ss 22:04 0:01 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 22:04 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 22:04 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 22:04 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< 22:04 0:00 [kworker/0:0H-events_highpri]
root 7 0.0 0.0 0 0 ? I 22:04 0:00 [kworker/0:1-mm_percpu_wq]
root 9 0.0 0.0 0 0 ? I< 22:04 0:00 [mm_percpu_wq]
root 10 0.0 0.0 0 0 ? S 22:04 0:00 [rcu_tasks_rude_]
root 11 0.0 0.0 0 0 ? S 22:04 0:00 [rcu_tasks_trace]
root 12 0.0 0.0 0 0 ? S 22:04 0:00 [ksoftirqd/0]
root 13 0.1 0.0 0 0 ? I 22:04 0:00 [rcu_sched]
root 14 0.0 0.0 0 0 ? S 22:04 0:00 [migration/0]
root 15 0.0 0.0 0 0 ? S 22:04 0:00 [idle_inject/0]
root 16 0.0 0.0 0 0 ? S 22:04 0:00 [cpuhp/0]
root 17 0.0 0.0 0 0 ? S 22:04 0:00 [cpuhp/1]
root 18 0.0 0.0 0 0 ? S 22:04 0:00 [idle_inject/1]
root 19 0.0 0.0 0 0 ? S 22:04 0:00 [migration/1]
...........................
ali@zion:~$ echo gnuadm.in > process.txt
ali@zion:~$ cat process.txt
gnuadm.in
Gördüğünüz gibi, > işaretiyle yönlendirme yapıldığında, var olan dosyanın içeriğinin tamamı siliniyor. Dosya yoksa, oluşturulur.
Linux Shell'inde ">>" İşareti:
>
işaretine oldukça benzer bir davranış sergiler. >>
kullanarak yine bir dosyaya çıktı yönlendirebilirsiniz. Farklı olarak, dosyanın eski içeriğini silmek yerine üzerine ekler (append):
ali@zion:~$ cat process.txt
gnuadm.in
ali@zion:~$ echo "Welcome to Linux blog" >> process.txt
ali@zion:~$ cat process.txt
gnuadm.in
Welcome to Linux blog
Linux Shell'inde "2>" ve "2>>" İşaretleri:
>
ve >>
işaretlerinde edindiğimiz mantık devam ediyor. Biri var olan dosyayı silerken, diğeri üzerine ekliyor. Farklı olarak, 2
ile hata mesajlarını yönlendiriyoruz.
Örneğimizde, ls
komutu ile 2 dosyayı listeliyoruz. Dosyalardan biri bulunmadığı için hata verecek. Ancak biz, bu hata mesajını error.txt
dosyasına yazdıracağız:
ali@zion:~$ ls process.txt process2.txt 2> error.txt
process.txt
ali@zion:~$ cat error.txt
ls: 'process2.txt''e erişilemedi: Böyle bir dosya ya da dizin yok
Gördüğünüz gibi, ls
komutunun hatalı çıktısı ekrana değil, dosyaya yazıldı.
Linux Shell'inde "&>" ve "&>>" İşaretleri:
Yine aynı mantıkla çalışır. &
işareti ile hem standart çıktıyı (stdout) hem de hata mesajlarını (stderr) görmek istediğimizi belirtiyoruz.
ali@zion:~$ ls process.txt process2.txt &> error.txt
ali@zion:~$ cat error.txt
ls: 'process2.txt''e erişilemedi: Böyle bir dosya ya da dizin yok
process.txt
ali@zion:~$ ls process.txt process2.txt &>> error.txt
ali@zion:~$ cat error.txt
ls: 'process2.txt''e erişilemedi: Böyle bir dosya ya da dizin yok
process.txt
ls: 'process2.txt''e erişilemedi: Böyle bir dosya ya da dizin yok
process.txt
Bir önceki örnekten farklı olarak, başarıyla listelenen process.txt
dosyası da çıktılarımızın arasında görülüyor.
Linux Shell'inde "<" İşareti:
<
işaretinin sağ tarafında verilen dosya içeriği, sol tarafında belirtilen komuta girdi olarak gönderilir.
Daha önceki örneklerde hazırladığımız process.txt
dosyasını, nl
komutuna girdi olarak yönlendirelim. Tabii ki nl
komutunu kullanmak için bunu yapmak zorunda değiliz. Sadece bir örnek yapıyoruz:
Linux Shell'inde "<<" İşareti ve EOF İfadesi:
Bir önceki işaretten farklı olarak, dosya değil, standart girdi (stdin) yönlendirmesi yapar. EOF
, end of fileı ifade eder. Ancak EOF yerine farklı kelimeler de kullanabilirsiniz. Burada amaç, girdilerin başlayacağı ve biteceği noktaları belirtmektir.
Aşağıdaki örnekte, nl
komutuna girdileri standart girdiden gönderiyoruz:
ali@zion:~$ nl << EOF
> line 1
> line 2
> line 3
> line 4
> line 5
> EOF
1 line 1
2 line 2
3 line 3
4 line 4
5 line 5
Linux Shell'inde "|" (Pipe) İşareti:
|
işaretini kullanarak, bir programın çıktısını başka bir programa yönlendirebiliriz.
ali@zion:~$ ps aux | head -4
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 168552 11784 ? Ss 22:04 0:01 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 22:04 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 22:04 0:00 [rcu_gp]
ps aux
komutu ile tüm process'leri listeledikten sonra, bu çıktıyı head -4
komutuna yönlendirdik. Bu sayede, ilk 3 process'i listelemiş olduk (ilk satır, sütunların isimlerini belirttiği için 4 kullandık).
Yönlendirmelerin Kullanılabileceği Alanlar
Bu nokta, aslında sizin ihtiyacınıza ve yaratıcılığınıza bağlı. Örneğin, sistemdeki kullanıcılardan /bin/false
shell'ini kullananların alfabetik listesini, başlarında sıra numarası olacak şekilde bir dosyaya almayı deneyelim: