Masukan dan keluaran Linux: pengalihan berkas serta pipa Bash

Perintah shell biasanya mempunyai tiga saluran: masukan standar (stdin), keluaran standar (stdout), dan kesalahan standar (stderr). Di Bash, < menyediakan masukan dari berkas, > dan >> menyimpan keluaran normal, sedangkan 2> menyimpan pesan galat. Pipa | menghubungkan keluaran satu perintah ke masukan perintah berikutnya. Menelusuri saluran ini menjelaskan mengapa sebagian hasil terlihat di layar dan sebagian tersimpan di tempat lain.

Di sini kita mengikuti aliran masukan, keluaran, dan galat menuju berkas atau perintah. Syarat keberhasilan atau kegagalan untuk && dan || dibahas dalam panduan alur eksekusi shell berbahasa Inggris.

Membedakan tiga aliran standar

Proses mengenali saluran berkas melalui nomor yang disebut deskriptor berkas. Tiga deskriptor standar umumnya terhubung ke terminal pada awalnya, tetapi pengalihan dan pipa dapat mengubah sumber atau tujuannya.

Nomor Aliran Peran utama
0 Masukan standar (stdin) Data yang dibaca perintah
1 Keluaran standar (stdout) Hasil normal
2 Kesalahan standar (stderr) Diagnostik dan pesan galat

Kedua aliran keluaran dapat terlihat bersama di terminal, tetapi tetap terpisah. Menyimpan keluaran normal dengan > dapat membiarkan pesan galat tetap muncul di layar. Nomor ini menjelaskan notasi seperti 2>: tanpa nomor, > mengalihkan stdout, sedangkan 2> mengalihkan stderr.

Membuat berkas latihan

Contoh memakai Bash dan akun pengguna biasa. Jika ~/linux-course-14-practice sudah ada, pilih nama lain dan sesuaikan jalur. Berhenti jika mkdir atau cd gagal. Jalankan pembuatan berkas hanya setelah pwd menunjukkan direktori latihan baru dan kosong, karena > mengosongkan lalu menulis ulang berkas yang sudah ada.

mkdir ~/linux-course-14-practice
cd ~/linux-course-14-practice
pwd

Setelah lokasinya benar, simpan dua baris, kemudian tambahkan baris ketiga. Operator >> menambahkan keluaran ke akhir berkas, bukan mengganti isi sebelumnya.

printf 'alpha\nbeta\n' > source.txt
printf 'gamma\n' >> source.txt
cat source.txt

cat terakhir menampilkan alpha, beta, lalu gamma pada tiga baris. Tentukan apakah Anda ingin mengganti isi atau menambahkannya sebelum memilih operator. Berkas tujuan yang belum ada dapat dibuat oleh > maupun >> selama lokasi dan izinnya memungkinkan.

Memberikan masukan dan menyimpan keluaran normal

Operator < menghubungkan berkas ke stdin. wc -l < source.txt memberikan aliran masukan, bukan argumen nama berkas, sehingga hanya angka 3 yang dicetak. Sebaliknya, wc -l source.txt biasanya menambahkan nama berkas setelah angka.

wc -l < source.txt

Untuk menyimpan keluaran normal, gunakan >. Pada baris grep berikut, baris yang cocok ditulis ke matches.txt dan tidak langsung dicetak di terminal. Baris cat sesudahnya membaca kembali hasil tersimpan.

grep 'beta' source.txt > matches.txt
cat matches.txt

Pastikan cat matches.txt menampilkan beta. Shell membuka tujuan pengalihan sebelum perintah utama berjalan. Salah menulis nama berkas penting setelah > dapat menghapus isinya meskipun perintah berikutnya gagal. Jangan mengarahkan hasil kembali ke source.txt yang sedang dibaca.

Menangani pesan galat secara terpisah

Ketika tidak menemukan berkas, ls menulis diagnostik ke stderr. Contoh ini mengandaikan absent-14.txt tidak ada dalam direktori latihan baru. Baris pertama menyimpan hanya pesan galat ke errors.txt; cat kemudian menampilkannya sebagai keluaran normal.

ls absent-14.txt 2> errors.txt
cat errors.txt

Kalimat pesan mengikuti locale atau pengaturan bahasa lingkungan, tetapi harus menjelaskan bahwa berkas tidak ada. Status ls yang gagal berbeda dari status cat berikutnya yang berhasil membaca berkas pesan. Jika perlu mengetahui status ls, periksa segera setelah ls sebelum menjalankan cat.

Untuk menyatukan keluaran normal dan galat dalam satu berkas, gunakan bentuk perintah > all.txt 2>&1. Di sini perintah adalah nama pengganti yang harus diganti perintah nyata. Notasi 2>&1 membuat deskriptor 2 mengacu ke tujuan deskriptor 1 saat itu, bukan ke berkas bernama 1.

ls absent-14.txt > all.txt 2>&1
cat all.txt

Pengalihan diproses dari kiri ke kanan. Dengan > all.txt 2>&1, stdout lebih dahulu menuju all.txt, lalu stderr mengikuti tujuan itu. Membaliknya menjadi 2>&1 > all.txt tidak setara: stderr mengikuti tujuan stdout yang lama, biasanya terminal, kemudian hanya stdout dipindahkan ke berkas. Karena ls contoh ini hanya menghasilkan galat, all.txt pada bentuk terbalik dapat kosong.

Menghubungkan dua perintah dengan pipa

Pipa | mengirim stdout perintah kiri ke stdin perintah kanan. Contoh ini memilih baris yang memuat beta, lalu menghitung baris yang diterima wc:

grep 'beta' source.txt | wc -l

Hasil untuk berkas latihan adalah 1. Pipa biasa tidak sekaligus meneruskan stderr dari perintah kiri. Jika ada galat, pesannya dapat tetap menuju terminal sementara perintah kanan menerima keluaran normal saja.

Secara bawaan, status pipeline Bash adalah status perintah terakhir. Bila grep tidak menemukan kecocokan tetapi wc -l berhasil mencetak 0, pipeline tetap dapat berstatus berhasil. Bila kegagalan tahap awal penting, periksa tiap tahap atau pertimbangkan pipefail. Saat pipefail aktif, statusnya adalah status bukan nol dari perintah paling kanan yang gagal, atau nol jika semuanya berhasil. Tidak adanya kecocokan pada grep sendiri berstatus 1, sehingga perlu ditafsirkan sesuai tujuan tugas.

Pengalihan mengubah sumber atau tujuan aliran sebuah perintah; pipa menghubungkan perintah. Jika hasil tidak sesuai dugaan, jalankan tiap tahap sendiri dan periksa apakah nilai atau galat keluar melalui stdout atau stderr. Latihan ini hanya menulis berkas dalam direktori baru; source.txt tetap berisi tiga baris setelah proses pembacaan selesai.

Dokumentasi resmi

Dokumentasi pengalihan GNU Bash menjelaskan <, >, 2>, dan urutan pemrosesan. Dokumentasi pipeline GNU Bash membahas sambungan pipa dan status keluarnya.