Ana içeriğe geç

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:

linux'ta girdi çıktı yönlendirme
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):

linux'ta girdi çıktı yönlendirme
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:

linux'ta hata mesajlarını yönlendirme
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.

linux'ta stdout ve stderr yönlendirmesi
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'ta girdi yönlendirme
ali@zion:~$ nl < process.txt 
     1  gnuadm.in
     2  Welcome to Linux blog

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:

linux'ta standart girdi yönlendirme
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.

linux'ta piping
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:

linux'ta girdi çıktı yönlendirme
ali@zion:~$ grep /bin/false /etc/passwd | cut -d ":" -f 1 | sort | nl > bin_false_users.txt
ali@zion:~$ cat bin_false_users.txt 
     1  debian-tor
     2  gdm
     3  gnome-initial-setup
     4  hplip
     5  speech-dispatcher
     6  tss
     7  whoopsie