Anatomi terminal

Perbedaan terminal, shell, dan console beserta komponen yang menyusun sebuah sesi interaktif.

Daftar isi

Topik ini memisahkan terminal, shell, dan console (antarmuka langsung milik mesin), kemudian menguraikan komponen yang menyusun sebuah sesi interaktif, dari jendela yang terlihat hingga perangkat di dalam kernel. Pemahaman komponen demi komponen ini menjadi dasar untuk mendiagnosis perilaku yang hanya muncul ketika perintah dijalankan dari skrip, bukan dari sesi interaktif. Setiap bagian disertai perintah sederhana agar komponen yang dibahas dapat diuji langsung.

Terminal, shell, dan console#

Terminal adalah titik ujung tempat masukan diketik dan keluaran teks ditampilkan. Pada masa awal UNIX, terminal berwujud perangkat keras sungguhan, yaitu mesin ketik elektronik seperti teletype yang mencetak keluaran pada kertas. Saat ini terminal berwujud aplikasi emulator, yaitu program yang meniru perangkat keras terminal lama di dalam sebuah jendela. Shell kemudian adalah program yang berjalan di dalam terminal itu dan bertugas menafsirkan perintah, sehingga satu jendela memuat dua program sekaligus dengan tugas yang berbeda.

Console menempati posisi yang berbeda dari keduanya, tanpa perantara jaringan maupun jendela, dan pada server fisik berupa papan ketik serta layar yang menempel langsung pada mesin. Perbandingan ketiganya dirangkum pada tabel berikut.

IstilahPeranWujud umum saat ini
terminalmenyediakan tempat mengetik dan menampilkan teksaplikasi emulator terminal dalam jendela
shellmembaca dan menafsirkan perintahbash, zsh, dash, dan sejenisnya
consoleantarmuka langsung milik sistem, tanpa perantara jaringanconsole virtual tty1 hingga tty6 pada Linux

Perbedaan ketiganya paling mudah dilihat dari tanggung jawab masing-masing. Terminal mengurus tampilan, shell mengurus keputusan, dan console adalah pintu masuk yang tetap ada bahkan ketika antarmuka grafis gagal atau tidak terpasang. Administrator server bekerja dari jauh melalui jaringan dan membuka emulator terminal, sedangkan console baru disentuh ketika mesin harus diperiksa langsung di tempatnya.

Perangkat tty sebagai penghubung#

UNIX menangani terminal melalui perangkat bernama tty, singkatan dari teletype, nama perangkat keras yang menjadi cikal bakal terminal. Warisan nama ini bertahan hingga kini, karena setiap sesi terminal pada Linux modern muncul sebagai berkas perangkat di direktori /dev/pts. Shell tidak dapat membedakan apakah lawan bicaranya mesin teletype sungguhan, console, atau jendela emulator, karena seluruhnya diperlakukan sebagai aliran byte yang dibaca dan ditulis melalui perangkat tty.

Jendela emulator pada sistem grafis tidak berbicara langsung dengan perangkat keras. Kernel menyediakan pasangan perangkat yang disebut pseudo-terminal (pty), yaitu dua ujung saluran yang saling tersambung. Ujung pertama dipegang emulator, sedangkan ujung kedua dipegang shell. Ketikan dari pengguna diteruskan oleh emulator ke ujung pertama, shell membacanya dari ujung kedua, dan keluaran shell kembali mengalir melalui jalur yang sama untuk dirender di jendela.

Desain ini menjelaskan perilaku yang mungkin terasa aneh pada awalnya. Program yang dijalankan dari emulator tetap bekerja tanpa memandang bentuk jendelanya, karena yang dipegang oleh program adalah perangkat, bukan jendela itu sendiri. Sebaliknya, program yang dijalankan tanpa terminal sama sekali, misalnya dari penjadwal otomatis, tetap dapat berjalan selama tidak mencoba membaca atau menulis ke tty.

Komponen sesi interaktif#

Sebuah sesi interaktif tersusun atas komponen-komponen yang bekerja berurutan. Mengetahui daftar ini memudahkan penelusuran ketika sesi berperilaku aneh, karena setiap komponen memiliki tanggung jawab yang tidak saling menggantikan. Daftar berikut diurutkan dari yang paling dekat dengan pengguna.

  1. Aplikasi terminal menyediakan jendela, font, warna, dan cara teks ditampilkan.
  2. Perangkat pty menghubungkan emulator dengan shell di dalam kernel.
  3. Proses shell membaca perintah, menafsirkannya, lalu menjalankannya.
  4. Prompt menandai kesiapan shell menerima perintah baru, dan isinya diatur melalui variabel PS1.
  5. Fasilitas pengeditan baris GNU Readline, yaitu library (kumpulan kode siap pakai) yang menyediakan kursor, riwayat perintah, dan pelengkapan nama berkas.

Empat komponen pertama bersifat wajib, sedangkan Readline adalah kemudahan yang membuat sesi interaktif nyaman digunakan. Ketika perintah diketik, Readline mengelola kursor serta karakter yang muncul di layar. Baris perintah dikirim ke shell hanya setelah tombol Enter ditekan, sehingga kesalahan ketik masih dapat diperbaiki sebelum perintah dijalankan. Urutan komponen ini juga menentukan urutan diagnosis, karena masalah tampilan berhenti di emulator, sedangkan masalah penafsiran perintah berhenti di shell.

Siklus baca, tafsir, dan jalankan#

Sesi interaktif berjalan sebagai satu putaran yang terus berulang, yaitu shell mencetak prompt, membaca satu baris melalui Readline, menguraikan baris itu, menjalankan perintahnya, lalu mencetak prompt kembali. Prompt yang dicetak hanyalah teks yang diambil dari variabel PS1, sehingga bentuknya dapat diatur sesuai selera. Prompt hanya dicetak pada sesi interaktif, sedangkan sesi non-interaktif seperti eksekusi skrip tidak mencetaknya karena tidak ada manusia yang menunggu jawaban.

bash
# isi variabel PS1 saat perintah dijalankan di luar sesi interaktif
echo "${PS1-(tidak diisi)}"
text Keluaran
(tidak diisi)

Keluaran di atas memperlihatkan bahwa PS1 memang tidak diisi pada sesi non-interaktif, sehingga blok perintah semacam ini berjalan tanpa prompt sama sekali. Pada sesi interaktif, variabel yang sama umumnya berisi pola seperti \u@\h:\w\$ yang merakit nama pengguna, nama mesin, dan direktori kerja menjadi satu baris prompt.

Setelah baris dibaca, shell menentukan siapa yang menjalankan perintah. Sebagian perintah berupa builtin (perintah yang dieksekusi oleh shell itu sendiri, tanpa membuat proses baru), sedangkan sisanya berupa program terpisah yang dicari oleh shell di direktori-direktori yang tercatat pada variabel PATH. Perintah type melaporkan status keduanya.

bash
# echo adalah builtin, dijalankan oleh shell sendiri
type echo
# ls adalah program terpisah yang dicari shell di PATH
type ls
text Keluaran
echo is a shell builtin
ls is /usr/bin/ls

Keluaran di atas menunjukkan kedua kemungkinan tersebut. Perintah echo dijalankan langsung oleh bash, sedangkan ls berupa program di /usr/bin/ls yang diluncurkan sebagai proses baru. Pemisahan ini penting dipahami karena builtin selalu tersedia, sedangkan program eksternal hanya ada apabila berkasnya terpasang dan jalurnya tercatat di PATH.

Console virtual pada Linux#

Kernel Linux menyediakan beberapa console virtual sebagai bagian dari sistem. Console ini bernomor, umumnya tty1 hingga tty6, dan dapat dituju dengan kombinasi tombol seperti Ctrl+Alt+F3 pada mesin yang sedang menjalankan antarmuka grafis. Tampilannya berupa layar teks penuh tanpa jendela, lengkap dengan prompt login milik sistem. Program getty menunggu di setiap console virtual, meminta nama pengguna dan kata sandi, lalu meluncurkan shell login setelah keduanya benar. Nama perangkatnya dapat dilihat langsung di direktori /dev, misalnya /dev/tty1 untuk console virtual pertama.

Console virtual menjadi jalan keluar yang berharga ketika antarmuka grafis macet, karena console ini tidak bergantung pada layar grafis sama sekali. Pada server tanpa antarmuka grafis, console juga menjadi satu-satunya titik akses langsung, dan sebagian perangkat menyediakan console-nya melalui saluran serial untuk kebutuhan pemeliharaan. Berbeda dengan jendela emulator yang dapat dibuka berpuluh-puluh sekaligus, jumlah console virtual terbatas dan ditetapkan oleh kernel saat sistem dinyalakan. Dengan kata lain, console ini milik sistem, bukan milik sesi grafis yang sedang berjalan.

Kesalahan umum#

Kesalahan yang paling sering terjadi pada topik ini adalah menjalankan perintah yang memerlukan tty dari lingkungan tanpa terminal. Perintah seperti tty dan stty membaca status terminal melalui masukan standar. Apabila masukan tersebut bukan terminal, misalnya karena perintah dijalankan dari skrip, dari penjadwal, atau dari alat otomasi, perintahnya melaporkan kegagalan alih-alih menampilkan nama perangkat.

bash
# periksa apakah masukan standar tersambung ke terminal
tty
text Keluaran
not a tty

Keluaran not a tty di atas muncul karena eksekusi contoh di sandbox ini berlangsung tanpa terminal interaktif, sehingga masukan standarnya bukan tty. Pada sesi interaktif, perintah yang sama umumnya mencetak nama perangkat seperti /dev/pts/0. Perbaikannya ada dua, yaitu menjalankan perintah semacam ini hanya pada sesi interaktif, atau menguji kondisi terminal di dalam skrip terlebih dahulu sebelum memanggilnya.

Kekeliruan kedua adalah menganggap pengaturan jendela sebagai pengaturan shell. Font, ukuran, dan skema warna dimiliki emulator terminal, sedangkan shell hanya mencetak teks ke perangkat yang tersedia. Karena itu, skrip shell tidak dapat mengubah ukuran jendela, dan pengaturan tampilan dicari di menu aplikasi terminal, bukan di berkas konfigurasi shell.

Ringkasan#

  • Terminal adalah tempat teks diketik dan ditampilkan, shell adalah program yang menafsirkan perintah di dalamnya, dan console adalah antarmuka langsung milik mesin.
  • Sesi interaktif tersusun atas emulator terminal, perangkat pty, proses shell, prompt dari PS1, dan fasilitas pengeditan baris Readline.
  • Prompt hanya dicetak pada sesi interaktif, dan perintah yang mengandalkan tty akan gagal ketika dijalankan tanpa terminal.

Referensi#