Pipe

Merangkai perintah menjadi aliran pengolahan data dan filosofi Unix di baliknya.

Daftar isi

Pipe adalah mekanisme shell untuk menghubungkan keluaran sebuah perintah langsung ke masukan perintah lain melalui tanda |. Dengan pipe, beberapa program kecil dapat dirangkai menjadi satu rangkaian pengolahan data yang bekerja serentak. Topik ini membahas cara kerja pipe, contoh rangkaian dua dan tiga perintah, filosofi Unix yang melatarbelakanginya, serta hubungan pipe dengan redirection.

Cara kerja pipe#

Tanda | tidak pernah diterima oleh perintah mana pun. Shell membaca tanda tersebut, lalu menjalankan perintah di kiri dan kanannya sekaligus, dan menghubungkan stdout perintah kiri ke stdin perintah kanan melalui buffer di dalam kernel. Data mengalir di antara keduanya sebagai urutan byte tanpa struktur tambahan, biasanya berupa teks baris demi baris.

Hubungan ini menghilangkan ketergantungan antarprogram. Perintah di kiri tidak mengetahui ke mana keluarannya dikirim, sedangkan perintah di kanan tidak mengetahui dari mana masukannya berasal. Keduanya hanya perlu patuh pada kesepakatan yang sama, yaitu membaca stdin dan menulis stdout. Diagram berikut menggambarkan aliran data pada rangkaian tiga perintah, dari berkas sensor.txt sampai ke layar.

cat sensor.txtsort -rhead -n 3pipestdout ke stdinpipestdout ke stdinlayarSetiap tahap membaca masukan standar dan menulis keluaran standar ke tahap berikutnya.
Aliran data pada rangkaian tiga perintah

Merangkai dua perintah dan lebih#

Contoh pertama memakai dua perintah. printf menghasilkan tiga baris nama buah dalam urutan acak, lalu sort membaca baris-baris itu melalui pipe dan mencetaknya terurut. Setelah itu, cat sensor.txt | tail -n 3 menampilkan tiga pengukuran terakhir dari berkas sensor: tail -n 3 menerima seluruh isi berkas melalui stdin dan hanya mencetak tiga baris akhirnya.

bash
# menyiapkan folder kerja dan berkas contoh
mkdir -p /tmp/kerja-pipe
cd /tmp/kerja-pipe
printf '2026-11-02 08:00 24.1\n2026-11-02 09:00 24.8\n2026-11-02 10:00 25.6\n2026-11-02 11:00 26.2\n2026-11-02 12:00 27.0\n2026-11-02 13:00 27.4\n2026-11-02 14:00 26.8\n' > sensor.txt
cat sensor.txt
text Keluaran
2026-11-02 08:00 24.1
2026-11-02 09:00 24.8
2026-11-02 10:00 25.6
2026-11-02 11:00 26.2
2026-11-02 12:00 27.0
2026-11-02 13:00 27.4
2026-11-02 14:00 26.8
bash
cd /tmp/kerja-pipe
# mengurutkan keluaran printf melalui pipe
printf 'durian\nalpukat\njeruk\n' | sort
# menampilkan tiga pengukuran terakhir
cat sensor.txt | tail -n 3
text Keluaran
alpukat
durian
jeruk
2026-11-02 12:00 27.0
2026-11-02 13:00 27.4
2026-11-02 14:00 26.8

Cara membacanya adalah dari kiri ke kanan, tahap demi tahap. Setiap tahap menerima teks, mengolah, lalu menyerahkannya ke tahap berikutnya. Rangkaian tiga perintah berikut menambahkan head -n 3 di ujung, sehingga lima nama buah terurut dipotong menjadi tiga baris pertama.

bash
cd /tmp/kerja-pipe
# tiga tahap: hasil acak diurutkan, lalu dipotong
printf 'durian\nalpukat\njeruk\nmanggis\nnanas\n' | sort | head -n 3
text Keluaran
alpukat
durian
jeruk

Filosofi Unix di balik pipe#

Pipe lahir dari filosofi Unix, yakni prinsip perancangan yang menganjurkan program kecil yang melakukan satu pekerjaan dengan baik, serta teks sebagai antarmuka universal antarprogram. Douglas McIlroy, yang mengusulkan pipe pada era Unix awal, merumuskan gagasan itu sebagai program yang menulis keluaran ke aliran teks dan membaca masukan dari aliran teks tanpa memedulikan asal-usulnya.

Konsekuensinya terasa langsung pada praktik. sort tidak perlu mengenal head, dan head tidak perlu mengenal sort, tetapi keduanya langsung dapat digabungkan. Program yang dibuat bertahun-tahun setelahnya pun dapat disisipkan ke dalam rangkaian yang sama, asalkan membaca stdin dan menulis stdout. Kombinasi perkakas sederhana seperti ini menghasilkan kemampuan yang jauh melampaui kemampuan tiap bagian secara terpisah, dan tidak perlu menulis program baru untuk setiap kebutuhan pengolahan.

Pipe hanya meneruskan stdout#

Pipe menghubungkan stdout ke stdin, tetapi tidak menyentuh stderr. Apabila perintah kiri mengalami error, pesannya tidak masuk ke pipe dan langsung tampil di layar, sedangkan perintah kanan hanya menerima keluaran biasa yang mungkin kosong.

bash
cd /tmp/kerja-pipe
# pipe hanya meneruskan stdout, bukan stderr
ls /tidak-ada | wc -l
text Keluaran
ls: cannot access '/tidak-ada': No such file or directory
0

Perintah wc -l menerima nol baris sehingga mencetak 0, sedangkan pesan error tetap terlihat karena tidak pernah masuk ke pipe. Apabila pesan error perlu ikut mengalir, arahkan stderr ke stdout terlebih dahulu dengan 2>&1 sebelum tanda |. Bentuk ls /tidak-ada 2>&1 | wc -l dengan demikian mencetak 1 karena pesan error kini dihitung sebagai satu baris masukan.

Menyaring dan menghitung di tengah aliran#

Rangkaian pipe menjadi berguna ketika ada tahap yang menyaring. Perintah grep mencetak setiap baris masukan yang memuat kata yang dicari, sehingga cocok ditempatkan di tengah aliran. Contoh berikut menyaring catatan sensor yang memuat angka 27, kemudian menghitung banyak barisnya dengan wc -l.

bash
cd /tmp/kerja-pipe
# menampilkan pengukuran bersuhu 27 derajat ke atas
cat sensor.txt | grep 27
# menghitung banyaknya pengukuran tersebut
cat sensor.txt | grep 27 | wc -l
text Keluaran
2026-11-02 12:00 27.0
2026-11-02 13:00 27.4
2

Penyaring dapat diletakkan di posisi mana pun dalam rangkaian, termasuk lebih dari satu sekaligus, karena keluaran setiap tahap tetap berupa teks baris. Perintah head dan tail juga sering menduduki ujung rangkaian untuk memotong hasil. Dengan gabungan penyaring dan pemotong ini, pertanyaan berupa banyaknya baris tertentu dijawab tanpa membuka berkasnya sama sekali.

Menggabungkan pipe dengan redirection#

Keluaran akhir sebuah rangkaian dapat disimpan ke berkas dengan redirection. Tanda > melekat pada perintah terakhir dalam rangkaian, sehingga hanya hasil tahap terakhir yang ditulis ke berkas.

bash
cd /tmp/kerja-pipe
# menyimpan tiga baris pertama hasil rangkaian
cat sensor.txt | head -n 3 > ringkasan.txt
cat ringkasan.txt
text Keluaran
2026-11-02 08:00 24.1
2026-11-02 09:00 24.8
2026-11-02 10:00 25.6

Pengalihan pada ujung rangkaian hanya memengaruhi perintah terakhir, sedangkan perintah di depan tetap membaca dari sumber asalnya. Masukan tahap pertama pun dapat berasal dari berkas melalui <, sehingga bentuk lengkap sebuah rangkaian memuat tiga jenis koneksi sekaligus, yaitu masukan berkas, pipe antarperintah, dan keluaran berkas. Pola sort < masukan.txt | head -n 3 > hasil.txt memperlihatkan ketiganya dalam satu baris perintah.

Kesalahan umum#

Kesalahan pertama adalah menambahkan cat di awal tanpa keperluan. Bentuk cat sensor.txt | tail -n 3 berfungsi, tetapi tail -n 3 sensor.txt melakukan pekerjaan yang sama tanpa satu proses tambahan. Bentuk cat tetap dipakai apabila masukan memang sudah mengalir atau demi keterbacaan rangkaian panjang, bukan karena wajib.

Kesalahan kedua adalah menganggap perintah kiri berjalan sampai selesai lebih dahulu. Kedua sisi pipe berjalan serentak, sehingga untuk data besar pengolahan berlangsung berlapis: tahap kanan mulai bekerja sejak baris pertama tiba, bukan setelah seluruh keluaran selesai dibuat. Kesalahan ketiga adalah mengharapkan pesan error ikut mengalir ke tahap berikutnya. Seperti dijelaskan sebelumnya, hanya stdout yang masuk ke pipe, sehingga pesan error perlu diarahkan dengan 2>&1 apabila ingin diperlakukan sebagai data.

Ringkasan#

  • Tanda | menghubungkan stdout perintah kiri ke stdin perintah kanan, dan kedua perintah berjalan serentak sebagai proses terpisah.
  • Rangkaian dibaca dari kiri ke kanan, dengan setiap tahap mengolah teks lalu menyerahkannya ke tahap berikutnya.
  • Pipe hanya meneruskan stdout, sedangkan pesan error harus diarahkan dengan 2>&1 agar ikut mengalir, dan keluaran akhir rangkaian dapat disimpan dengan >.
  • Filosofi Unix menganjurkan program kecil yang masing-masing melakukan satu pekerjaan dengan baik dan berkomunikasi melalui aliran teks.

Referensi#