Filosofi Unix yang membedakan Linux adalah perintah kecil yang masing-masing melakukan satu hal dengan baik, lalu dirangkai menjadi alur yang kuat. Perangkainya adalah dua mekanisme: pipe yang mengalirkan output satu perintah menjadi input perintah lain, dan redirection yang menghubungkan aliran itu dengan file. Pada Chapter ini kita akan memahami tiga arus data setiap perintah, lalu memakai pipe, redirection output dan input, serta tee dalam satu rangkaian latihan.

Tiga Arus Data Setiap Perintah #

Setiap program yang berjalan di Linux terhubung ke tiga arus data yang sudah disiapkan shell, masing-masing dengan nomor file descriptor:

ArusNomorIsiTujuan bawaan
stdin0input yang dibaca programpapan ketik
stdout1hasil kerja normallayar
stderr2pesan error dan peringatanlayar

Dua arus terakhir sama-sama tampil di layar, tetapi keduanya terpisah — pemisahan inilah yang memungkinkan kita menangkap hasil kerja tanpa tercampur pesan error. Seluruh operator pada chapter ini memindahkan tujuan ketiga arus tersebut.

Menyalurkan Output dengan Pipe #

Operator | menyambungkan stdout perintah kiri ke stdin perintah kanan. Data mengalir tanpa file perantara, dan kedua perintah berjalan bersamaan. Blok berikut memuat dua pipeline dasar sekaligus satu kombinasi klasik:

bash
printf 'apel\njeruk\nmangga\npisang\n' > buah.txt
cat buah.txt | grep a
cat buah.txt | wc -l
printf 'error\ninfo\nerror\ninfo\nerror\n' > akses.log
sort akses.log | uniq -c | sort -rn

Output yang Dihasilkan:

text
apel
mangga
pisang
4
      3 error
      2 info

Pipeline pertama menyaring baris yang mengandung huruf a — jeruk gugur karena tidak memuatnya. Pipeline kedua menghitung baris: cat menyalin isi buah.txt ke stdout, wc -l menerima aliran itu di stdin-nya lalu mencetak jumlah barisnya. Dua baris terakhir adalah penghitung frekuensi yang klasik: sort mengelompokkan baris sama bersebelahan, uniq -c meringkas tiap kelompok menjadi satu baris berisi jumlahnya, lalu sort -rn mengurutkan hasil menurut angka secara menurun. Pola sort | uniq -c | sort -rn ini adalah cara cepat mencari entri terbanyak pada file log apa pun.

Operator > mengalihkan stdout ke file: isi file dibuat baru setiap kali, sedangkan >> menambahkan di belakang isi lama. Kebalikannya, < mengalihkan stdin agar program membaca dari file:

bash
printf 'awal\n' > log.txt
printf 'tambahan\n' >> log.txt
cat log.txt
printf 'menimpa\n' > log.txt
sort < log.txt

Output yang Dihasilkan:

text
awal
tambahan
menimpa

Mari kita bedah baris per barisnya:

  1. Baris 1 (> log.txt): membuat log.txt berisi satu baris awal; file lama dengan nama sama akan langsung hilang isinya.
  2. Baris 2 (>> log.txt): menempelkan tambahan setelah baris terakhir tanpa menghapus yang ada.
  3. Baris 3 (cat log.txt): membuktikan isinya kini dua baris.
  4. Baris 4 (printf ... > log.txt): menimpa seluruh isi — awal dan tambahan lenyap, digantikan menimpa.
  5. Baris 5 (sort < log.txt): memberi sort file sebagai stdin; hasilnya identik dengan cat log.txt | sort.

Perhatikan bahwa sort < log.txt memberi hasil yang sama dengan pipa cat log.txt | sort — bedanya, bentuk < tidak memerlukan perintah perantara. Untuk satu file, < lebih ringkas; untuk rangkaian banyak tahap, pipe lebih tepat.

Menangani Pesan Error dengan 2> dan 2>&1 #

Arahkan angka 2 untuk menangkap stderr secara terpisah. File khusus /dev/null menjadi lubang pembuang: apa pun yang ditulis ke sana lenyap, berguna saat kita sengaja mengabaikan pesan error:

bash
ls file-tidak-ada 2> error.txt
cat error.txt
ls file-tidak-ada 2>/dev/null
echo "alur tetap berjalan"
ls file-tidak-ada 2>&1 | wc -l

Output yang Dihasilkan:

text
ls: cannot access 'file-tidak-ada': No such file or directory
alur tetap berjalan
1

Baris pertama memindahkan pesan error ke file sehingga layar bersih, dan cat membuktikan pesannya tersimpan. Baris ketiga membuang pesan serupa ke /dev/null. Baris terakhir memakai 2>&1 — “gabungkan stderr ke stdout” — sehingga pesan error ikut mengalir ke dalam pipe dan bisa dihitung wc -l. Aturan lengkap semua bentuk redirection terdapat pada bagian Redirection di halaman manual bash(1) .

Menyalin ke Dua Arah dengan tee #

Pipe terkadang membuat output “lenyap” ke perintah berikutnya padahal kita juga ingin melihatnya. Perintah tee menyelesaikan dua keinginan itu sekaligus: menyalin stdin ke file dan meneruskannya ke stdout:

bash
printf 'baris penting\n' | tee salinan.txt
cat salinan.txt

Output yang Dihasilkan:

text
baris penting
baris penting

Baris baris penting tampil dua kali — sekali dari tee yang meneruskan ke layar, sekali dari cat yang membaca salinannya. Dalam praktik, tee dipakai di tengah pipeline panjang, misalnya ... | tee checkpoint.txt | ..., untuk menyimpan hasil tahap tengah tanpa memutus alurnya.

Dengan pipe dan redirection, kita kini bisa merangkai perintah menjadi alur data yang utuh. Satu hal terakhir menyempurnakan alat berpikir kita: angka kecil yang ditinggalkan setiap perintah sebagai laporan hasil — materi Chapter Exit Codes.